DrawRect

绘图很简单,前提是你有了view的子类,只需重载这一个方法drawRect就可以了。

1
- (void)drawRect:(CGRect *)name;

他的参数是个矩形,这个矩形就是你要重绘的区域,你可以忽略参数,它只是为了性能优化,只在规定的区域绘图。

但是,永远不要去调用drawRect。因为drawRect不是让你调用的,系统会去调用。

那么问题来了,我怎么去告诉系统需要重绘呢?

你使用这两个方法:

1
2
- (void)setNeedsDisplay;
- (void)setNeedsDisplayInRect:(CGRect)name;

你们可以认为初始化的时候的设置是一个点,然后晚些系统查看所有需要重绘的东西,然后把他们顺序排列(因为有些东西可能会重叠),然后在非常高效的把需要的东西重绘出来。

这样做有两个好处,一是让系统依据层的情况最优化性能;二是如果你的property有一些setter,当你设置的时候需要重绘,这种情况也被最优化了。

所以你所有的setter都会调用self的setNeedsDisplay来重绘。如果有人用了你的view,然后调用了好几遍这些setter,只需要重绘一次,,每个setNeedsDisplay都被一起传过去,然后一次性画出来。而不是每次都重绘,导致不停的绘图,绘图的开销可是相当大的。