layoutSubviews的触发与执行

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就不会再被执行,没有打印。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 自动布局在 OS X 10.7 中被引进,一年后在 iOS 6 中也可以用了。不久在 iOS 7 中的程序将会有望...
    评评分分阅读 4,487评论 0 7
  • 7、不使用IB是,下面这样做有什么问题? 6、请说说Layer和View的关系,以及你是如何使用它们的。 1.首先...
    AlanGe阅读 4,210评论 0 1
  • 转载:http://www.cocoachina.com/swift/20161201/18198.html 前言...
    F麦子阅读 9,828评论 2 8
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,375评论 30 472
  • 不是王雪晴不和你一起过端午,金浩达忙着考试,你就不知道自己该怎么过了!李国荣,记住,一切都是靠你自己的。最痛苦的时...
    李国荣阅读 2,870评论 0 0