关于子类中init,drawRect和layoutSubView方法的小研究


init方法:视图初始化时调用的方法,用于初始view的一些基本属性.此方法可以被多次调用但是只有第一次调用时初始化有效.

//系统的init方法每次调用输出123.

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        NSLog(@"123");
    }
    return self;
}

//创建一个自定义的view并初始化 再次调用初始化方法

    MyView * testView = [[MyView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    testView = [testView initWithFrame:CGRectMake(0, 0, 150, 50)];
    
    [self.window addSubview:testView];



通过上次两个方法 输出了两次"123" 说明init方法是可以被多次调用的. 但最后view的frame定格在了0 0 100 100 说明第二次调用init方法没有对view的frame进行刷新


drawRect方法:view的绘图方法,用于绘制view 一般创建自定义类的时候不建议重写此方法 如果需要重写则需要在方法内写上 [super drawRect:rect]调用父类的方法为view进行初始化,否则将会出现无法预期的错误.  

此方法比较特殊,它是由系统调用的方法,用户可以手动调用 [view setNeedsDisplay]方法来主动调用drawRect方法, 需要注意的是 drawRect方法每个方法块中只会在方法块结束时调用一次无论是系统调用还是手动调用.

layoutSubView和drawRect方法性质类似  只是系统调用的事件不同.layoutSubView在view进行添加或被添加时调用 改变view时也会调用.下面用实例测试下:

    //创建一个自定义view 为其赋值frame 并加载window

    view = [[MyView alloc] init];
    view.frame = CGRectMake(0, 0, 100, 100);
    [self.window addSubview:view];
输出结果如下:
2015-09-06 16:58:51.989 五子棋[3789:607] layoutSubView
2015-09-06 16:58:51.990 五子棋[3789:607] drawRect
两个方法都有调用  因为如果不给view一个初始化大小的话DrawRect方法是不会调用的  而改变Frame大小的时候会调用layoutSubView方法,

//试着只给view改变下背景颜色看看

view.backgroundColor = [UIColor greenColor];
2015-09-06 17:05:19.931 五子棋[3880:607] drawRect
只调用了drawRect方法 并且只在第一次改变颜色的时候调用.看来系统很机智,当系统判断视图属性改变不需要进行重绘时是不会调用DrawRect方法的,

//只改变frame会如何呢?

view.frame = CGRectMake(10, 10, 50, 50);
2015-09-06 17:08:49.906 五子棋[3934:607] layoutSubView
这次只是调用了layoutSubView方法  bounds属性同

透明度alpha和中心点center是不会触发这两个方法的. 

结语; 下面两个方法都只是在代码块运行完毕后仅调用一次,哪怕是放入循环体中 也只会在循环结束后调用一次,想要循环调用 可以使用NSTimer或NSThread;







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值