layoutSubviews的触发与执行

作者: JackChen__ | 来源:发表于2016-10-19 20:47 被阅读0次

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

    相关文章

      网友评论

        本文标题:layoutSubviews的触发与执行

        本文链接:https://www.haomeiwen.com/subject/cunxuttx.html