layoutsubViews

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 *)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 *)touches withEvent:(UIEvent *)event {
    
    [super touchesBegan:touches withEvent:event];
    
    [self setNeedsLayout];
    [self layoutIfNeeded];
    
    [self setNeedsLayout];
    [self layoutIfNeeded];
    
    
    [self setNeedsLayout];
    [self layoutIfNeeded];
}

你可能感兴趣的:(layoutsubViews)