layoutSubviews的触发表示layoutSubviews方法将会被执行,但不是立刻执行
layoutSubviews在以下情况下会被触发:
- init初始化不会触发layoutSubviews(initWithFrame会触发);
- addSubview会触发layoutSubviews;
- 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化;
- 滚动一个UIScrollView会触发layoutSubviews;
- 旋转Screen会触发父UIView上的layoutSubviews;
- 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews;
总结:只要改变view的frame,就会触发layoutSubviews,另外调用addSubview后也会触发layoutSubviews方法。
二、layoutSubviews的执行发生在视图显示之前的那一刻。
以下面的代码为例:
TestView
- (void)layoutSubviews {
[super layoutSubviews];
NSLog(@"layoutSubviews is invoked!");
}
- (void)print {
NSLog(@"print is invoked");
}
视图控制器
// 假设此方法执行完,屏幕上就会显示myView
- (void)viewDidLoad {
[super viewDidLoad];
// myView的frame改变,layoutSubviews方法被触发,但此处不会调用
myView = [[TestView alloc] initWithFrame:CGRectMake(99, 99, 99, 99)];
myView.backgroundColor = [UIColor blueColor];
[self.view addSubview:myView];
// 先执行myView中的print方法
[myView print];
//此处隐性执行myView的layoutSubviews方法
...
}
执行结果为先打印"print is invoked",再打印"layoutSubviews is invoked!"
注意:如果layoutSubviews方法没有被触发,那么它就不会被执行。例如:
在视图控制器中再添加一个点击事件
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
myView.frame = CGRectMake(80, 80, 80, 80);
}
第一次点击时,改变了myView的frame,layoutSubviews方法被触发,在新的myView呈现在屏幕之前layoutSubviews方法会被执行,打印出"layoutSubviews is invoked!"
第二次点击时,myView的frame仍然是(80, 80, 80, 80),并没有改变,所以layoutSubviews方法不会被触发,layoutSubviews就不会再被执行,没有打印。
网友评论