有了view的子类,只要重载一个方法drawRect
-(void)drawRect:(CGRect)aRect;
它的参数是个矩形,这个矩形就是你要重绘的区域,你可以忽略参数,它只是为了性能优化,只在固定的区域绘图.
注意!!!
永远不要去调用drawRect,因为drawRect不是让你调用的,而是系统会去调用的.
那怎么去告诉系统需要重绘呢?
你发送两个消息,setNeedsDisplay和setNeedsDisplayInRect.
-(void)setNeedsDisplay;
-(void)setNeedsDisplayInRect:(CGRect)aRect;
你们可以认为初始化的时候的设置是一个点,然后晚些系统查看所有需要重绘的东西,
然后把它们按顺序排列,因为有些东西可能会重叠,然后再非常高效的把需要的东西绘制出来.
这样做有两个好处,一是让系统依据层的情况最优化性能,
二是如果你的property有一些setter,当你设置的时候需要重绘,这种情况也被最优化了.
所以你所有的setter都会调用self的setNeedsDisplay来重绘.
如果有人用了你的view,然后调用了好几个这样的setter,只需要重绘一次.
每个setNeedsDisplay都被一起传过去,然后一次性画出来.而不是每次都重绘.