selector

layoutSubView那些事

2018-08-09  本文已影响0人  愤怒小鸟飞呀飞

layoutSubview

image.png

触发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

- (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
- (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

上一篇 下一篇

猜你喜欢

热点阅读