深入理解代替单纯记忆
执行时机
官方并没有明确说
UIView的layoutSubviews方法执行时机,文中说的执行时机是总结自参考文章中,主要来自实际测试
view.bounds发生变化变化时- 所以,当
view.frame.size变化时,方法会被执行,因为实际上改变的是view.bounds.size - 注意
bounds发生变化意味着除了size,origin的变化也会导致方法执行,比如UIScrollView的滚动原理就是改变bounds.origin - 当然也包括size间接被修改的情况,比如subview设置了autoresizingMask,superview'size改变触发subview的size变化的情况
- 如果设置前后,
bounds的值并没有变,方法也不会被执行
- 所以,当
- direct subviews' size改变时会触发执行,注意,是直接子view
- 执行
addSubview方法时,targetView.addSubview(subView),subView和targetView的layoutSubviews方法会执行 - 通过
setNeedsLayout或layoutIfNeed方法触发视图更新时layoutIfNeed执行时不一定会触发layoutSubviews执行,需要有layout updates时
再注意一点,当同时进行多层级视图的
layoutSubviews调用时,顺序是从上层到下层,即先superView在subView,superView先布局好,再让subView布局
一点思考
根据上面触发时机很容易能看出来
layoutSubviews是在那些需要执行的时候执行
从事一段时间iOS开发之后就能发现,苹果的设计思路(其他机构应该也是如此)就是,尽量只在有必要的时候才增加逻辑,能不增加系统额外消耗就不增加
- 就拿
addSubview时机来说,对于targetView,有子视图加入了,如果我想做一些精细化的布局调整,那就得依靠targetView的layoutSubviews时机;同时,subView加入到新的视图体系里面,也可能有些需要依赖superView才能完成的逻辑,此时也是通过layoutSubviews时机