iOS 开发成长中心iOS学习笔记iOS Developer

layoutSubviews的触发与执行

2016-10-19  本文已影响0人  JackChen__

layoutSubviews的触发表示layoutSubviews方法将会被执行,但不是立刻执行

layoutSubviews在以下情况下会被触发:

  1. init初始化不会触发layoutSubviews(initWithFrame会触发);
  2. addSubview会触发layoutSubviews;
  3. 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化;
  4. 滚动一个UIScrollView会触发layoutSubviews;
  5. 旋转Screen会触发父UIView上的layoutSubviews;
  6. 改变一个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就不会再被执行,没有打印。

上一篇下一篇

猜你喜欢

热点阅读