drawRect方法

来源:互联网 发布:阿里云ecs远程桌面 编辑:程序博客网 时间:2024/05/19 05:04

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在以下情况下会被调用:

 a、drawRect调用是在Controller->loadView, Controller->viewDidLoad 两方法之后系统自动调用的.所以不用担心在控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).

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 或者 setNeedsDisplayInRect,让系统自动调该方法。如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。

其他

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方法。
}

0 0