layoutSubView那些事
2018-08-09 本文已影响0人
愤怒小鸟飞呀飞
layoutSubview

- 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,原因未明。