美文网首页selector
layoutSubView那些事

layoutSubView那些事

作者: 愤怒小鸟飞呀飞 | 来源:发表于2018-08-09 17:03 被阅读0次

layoutSubview

image.png
  • qustions 设置frame结果(与设置autoLayout结果一样)
    红色视图是蓝色视图父视图
    1、蓝色视图x or y坐标改变,layoutSubview会调用么?红色视图的x,y坐标改变,layoutSubview调用么?
    不会
    2、蓝色视图 width or height改变,layoutSubview会调用么?
    蓝色视图及其父视图 红色视图 layoutSubview都会调用(draw rect不调用,那么draw rect的调用时机?)
    3、父视图红色视图的width or height改变,layoutSubview调动几次?
    只有父视图红色视图的layoutSubview调用,蓝色视图的layoutSubView不调用。

触发layoutSubView的时机?

- (void)buttonAction:(UIButton *)button{
    NSLog(@"buttonAction");
    _view1.frame = CGRectMake(100, 100, 100, 200);
}

修改view大小(跟新视图的contraint)
新增子view
用户在UIScrollview上滚动(layoutSubviews会在UIScrollview和它的父view上被调用)
用户旋转设备

设置frame或更新约束之后立即调用
添加子视图的视图,例如蓝色视图添加子视图,蓝色视图的layoutsubview调用

layoutSubView怎么用?
子视图的布局不满足我们的需求时,可以在此写子视图的布局

需要刷新本视图布局时,怎么触发此方法调用?
如何某个视图自身的bounds或者子视图的bounds发生改变,那么这个方法会在当前的runLoop结束时调用。为什么不是立即调用呢?因为渲染毕竟消耗性能。这种机制下UI控件布局上的变动不会立即生效,而是每次间隔一个周期,所有UI控件在布局上的变动统一生效并且在视图上更新。

setNeedsLayout 与 layoutIfNeeded

  • setNeedLayout 标记视图为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,在下一轮runLoop结束前刷新。
- (void)buttonAction:(UIButton *)button{
    NSLog(@"buttonAction");    
    [_view1 setNeedsLayout];
//    [_view1 layoutIfNeeded];
    NSLog(@"action end");
}
//打印结果
2018-08-09 16:19:28.217131+0800 DemoForView[57581:1263218] buttonAction
2018-08-09 16:19:28.218011+0800 DemoForView[57581:1263218] action end
2018-08-09 16:19:28.218982+0800 DemoForView[57581:1263218] DHHView layoutSubviews
  • layoutIfNeeded
    如果有需要刷新的标记,立即调用layoutSubview进行布局,在本次runLoop中立即布局
- (void)buttonAction:(UIButton *)button{
    NSLog(@"buttonAction");    
    [_view1 setNeedsLayout];
    [_view1 layoutIfNeeded];
    NSLog(@"action end");
}
//打印结果
2018-08-09 16:23:46.777068+0800 DemoForView[57725:1268377] buttonAction
2018-08-09 16:23:46.779389+0800 DemoForView[57725:1268377] DHHView layoutSubviews
2018-08-09 16:23:46.780492+0800 DemoForView[57725:1268377] action end

动画:

    [_view1 mas_updateConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view).offset(200); 
    }];
    [_subView mas_updateConstraints:^(MASConstraintMaker *make) {
        make.height.equalTo(@2); 
    }];
    [self.view setNeedsLayout];
    [UIView animateWithDuration:1 animations:^{
        [self.view layoutIfNeeded];
    }];

子视图动画,需要调用父视图的setNeedsLayout ,layoutIfNeeded,原因未明。

参考链接:

https://www.jianshu.com/p/d46bcc656e04

相关文章

网友评论

    本文标题:layoutSubView那些事

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