关于layoutSubviews的调用时机网上已经有很多总结了,以下为摘录的笔记:
1、init初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
在layoutSubviews方法内部做以上6种修改不会导致递归,以上6种触发也仅对调用者自己有效,对子视图 其他视图无效。
以上6种类型的触发都是异步的,同setNeedsLayout的机制相同,都是将view标记了,在runloop的下一迭代中再调用。
若希望在做了以上六点修改后同步地去调用layoutSubviews,则可以直接调用layoutIfNeeded。
调用setNeedsLayout之后再调用layoutIfNeeded也同样能够使得layoutSubviews被同步调用。
layoutSubviews中适合用来设置子视图的布局(frame),若是自定义的视图和它的子视图中都实现了layoutSubviews方法,那子视图的次方法中应该再调用父类的( [super layoutSubviews]; )。