layoutSubviews
eg: 自定義 一個 testView ,以及一個 subView(testView 的子檢視 ) 大概有下面 3個情況會觸發layoutSubViews
- Frame的改變 會觸發 ,包括 testView的 frame 改變(特別的如果初始化的Frame是 zero 會不會觸發的 ),或者 subView的frame的改變 ,都會觸發 testView 中的 layoutSubViews。
2.通過 addsubView 來觸發,比如 [testView addsubView:subView],也是會呼叫layoutSubViews
3.滾動一個UIScrollView會觸發layoutSubviews
通過以上3點 ,基本上大概瞭解了 layoutsubViews的觸發機制,但是我可以肯定的,如果 同時修改 父檢視testView的 frame ,並且執行 [testView addsubView:subView], 會呼叫 兩次 layoutSubViews?
答案是否定的,只呼叫一次,這裡我猜想,想修改上面的條件基本上是系統內部執行了 [view setNeedsLayout] 沒有馬上重新整理
[view setNeedsLayout] 不立即觸發layoutSubViews,只是標記將要重新整理,在系統runloop的下一個週期自動呼叫layoutSubViews, 但是執行 layoutIfNeeded(只是馬上觸發layoutSubViews的方法,如果單單的呼叫它是不會觸發layoutSubViews) 後會馬上觸發layoutSubViews
會觸發 觸發layoutSubViews 1次
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
[self setNeedsLayout];
[self setNeedsLayout];
[self setNeedsLayout];
// [self layoutIfNeeded];
// [self layoutIfNeeded];
// [self layoutIfNeeded];
}
會觸發 觸發layoutSubViews 3次
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
[self setNeedsLayout];
[self layoutIfNeeded];
[self setNeedsLayout];
[self layoutIfNeeded];
[self setNeedsLayout];
[self layoutIfNeeded];
}