layoutSubviews

weixin_34185560發表於2016-09-22

eg: 自定義 一個 testView ,以及一個 subView(testView 的子檢視 ) 大概有下面 3個情況會觸發layoutSubViews

  1. 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];
}