1,iPhone的绘图操作是在UIView类的drawRect方法中完成的,所以如果我们要想在一个UIView中绘图,需要重写drawRect方法,在这里进行绘图操作,程序会自动调用此方法进行绘图。
2,在UIView中,重写drawRect: (CGRect)aRect方法,可以自己定义想要画的图案.且此方法一般情况下只会画一次.也就是说这个drawRect方法一般情况下只会被掉用一次.
当某些情况下想要手动重画这个View,只需要掉用[self setNeedsDisplay]方法即可.(调用setNeedsDisplay会自动调用drawRect)。
drawRect调用是在Controller->loadView,Controller->viewDidLoad两方法之后调用的.所以不用担心在控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些Viewdraw的时候需要用到某些变量值).
3,drawRect在以下情况下会被调用:
b、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
c、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
d、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
drawRect方法使用注意点:
1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate的contextRef并且不能用于画图。drawRect:方法不能手动显式调用,必须通过调用setNeedsDisplay
其他
1,UIView的setNeedsDisplay和setNeedsLayout方法
首先两个方法都是异步执行的。而setNeedsDisplay会自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。
2,
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
[_shape draw:context];
}
- (void)draw:(Shape *)shape
{
_shape = shape;
[self setNeedsDisplay]; //setNeedsDisplay会自动调用drawRect方法
//否则_shape压根就没被赋值。没法画。而- (void)drawRect:(CGRect)rect 此方法又不能手动调用,因此系统提供给我们可以手动调用的setNeedsDisplay方法,此方法会自动调用drawRect方法。
}