layoutSubviews执行时机

2,984 阅读2分钟

深入理解代替单纯记忆

执行时机

官方并没有明确说UIViewlayoutSubviews方法执行时机,文中说的执行时机是总结自参考文章中,主要来自实际测试

  • view.bounds发生变化变化时
    • 所以,当view.frame.size变化时,方法会被执行,因为实际上改变的是view.bounds.size
    • 注意bounds发生变化意味着除了sizeorigin的变化也会导致方法执行,比如UIScrollView的滚动原理就是改变bounds.origin
    • 当然也包括size间接被修改的情况,比如subview设置了autoresizingMask,superview'size改变触发subview的size变化的情况
    • 如果设置前后,bounds的值并没有变,方法也不会被执行
  • direct subviews' size改变时会触发执行,注意,是直接子view
  • 执行addSubview方法时,targetView.addSubview(subView)subViewtargetViewlayoutSubviews方法会执行
  • 通过setNeedsLayoutlayoutIfNeed方法触发视图更新时
    • layoutIfNeed执行时不一定会触发layoutSubviews执行,需要有layout updates

再注意一点,当同时进行多层级视图的layoutSubviews调用时,顺序是从上层到下层,即先superView在subViewsuperView先布局好,再让subView布局

一点思考

根据上面触发时机很容易能看出来

layoutSubviews是在那些需要执行的时候执行

从事一段时间iOS开发之后就能发现,苹果的设计思路(其他机构应该也是如此)就是,尽量只在有必要的时候才增加逻辑,能不增加系统额外消耗就不增加

  • 就拿addSubview时机来说,对于targetView,有子视图加入了,如果我想做一些精细化的布局调整,那就得依靠targetViewlayoutSubviews时机;同时,subView加入到新的视图体系里面,也可能有些需要依赖superView才能完成的逻辑,此时也是通过layoutSubviews时机

参考