layoutSubview
- qustions 設置frame結果(與設置autoLayout結果一樣)
紅色視圖是藍色視圖父視圖
1、藍色視圖x or y坐標改變,layoutSubview會調(diào)用么?紅色視圖的x,y坐標改變垢揩,layoutSubview調(diào)用么?
不會
2、藍色視圖 width or height改變硫惕,layoutSubview會調(diào)用么?
藍色視圖及其父視圖 紅色視圖 layoutSubview都會調(diào)用(draw rect不調(diào)用野来,那么draw rect的調(diào)用時機恼除?)
3、父視圖紅色視圖的width or height改變,layoutSubview調(diào)動幾次?
只有父視圖紅色視圖的layoutSubview調(diào)用豁辉,藍色視圖的layoutSubView不調(diào)用令野。
觸發(fā)layoutSubView的時機?
- (void)buttonAction:(UIButton *)button{
NSLog(@"buttonAction");
_view1.frame = CGRectMake(100, 100, 100, 200);
}
修改view大谢占丁(跟新視圖的contraint)
新增子view
用戶在UIScrollview上滾動(layoutSubviews會在UIScrollview和它的父view上被調(diào)用)
用戶旋轉(zhuǎn)設備
設置frame或更新約束之后立即調(diào)用
添加子視圖的視圖气破,例如藍色視圖添加子視圖,藍色視圖的layoutsubview調(diào)用
layoutSubView怎么用餐抢?
子視圖的布局不滿足我們的需求時现使,可以在此寫子視圖的布局
需要刷新本視圖布局時,怎么觸發(fā)此方法調(diào)用弹澎?
如何某個視圖自身的bounds或者子視圖的bounds發(fā)生改變朴下,那么這個方法會在當前的runLoop結束時調(diào)用。為什么不是立即調(diào)用呢苦蒿?因為渲染畢竟消耗性能殴胧。這種機制下UI控件布局上的變動不會立即生效,而是每次間隔一個周期佩迟,所有UI控件在布局上的變動統(tǒng)一生效并且在視圖上更新团滥。
setNeedsLayout 與 layoutIfNeeded
- setNeedLayout 標記視圖為需要重新布局,異步調(diào)用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
如果有需要刷新的標記秉溉,立即調(diào)用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];
}];
子視圖動畫,需要調(diào)用父視圖的setNeedsLayout ,layoutIfNeeded,原因未明召嘶。