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];
}
网友评论