View的Layout方法粗解
参考链接:https://www.jianshu.com/p/2ef48c2f0c97
View的Layout方法主要有以下几种:
layoutSubviews
layoutIfNeeded
setNeedsLayout
setNeedsDisplay
drawRect
sizeThatFits
sizeToFit
先说结论
layoutSubviews方法不能手动调用,需要调用[self setNeedsLayout]来触发。drawRect也不能手动调用,需要调用[self setNeedsDisplay]来触发。- 最后剩下
layoutIfNeeded方法。这个方法在使用约束的时候调用,可以立即更新效果(立即刷新)。(例如:autoLayout 跟 frame 混用)setNeedsLayout不会立即刷新。 sizeThatFits:会计算出最优的size,并返回给你,但是view本身并不会改变size。sizeToFit会计算出最优size,并且改变view自身的size
layoutSubviews调用时机(系统调用)
直接调用[self setNeedsLayout];。initWithframe:如果初始frame为CGRectZero则不调用,否则调用addSubview的时候。view的size发生改变的时候,前提是frame的值设置前后发生变化。
滑动UIScrollView的时候。
旋转Screen会触发父View上的layoutSubviews事件**(待验证,作者说验证过没有触发)setNeedsDisplay调用时机
该方法在调用时,会自动调用drawRect方法。drawRect方法主要用来画图。
so:
当需要刷新布局时,用setNeedsLayOut方法;
当需要重新绘画时,调用setNeedsDisplay方法。
粗浅的总结
总的来说:我们可以重写父类的layoutSubviews 和 drawRect 方法,但是我们不能手动调用它们,而是需要分别调用setNeedsLayout 和 setNeedsDisplay这两个方法来触发。
View的Layout方法粗解
http://shalliy.github.io/2018/08/28/002-View的Layout方法粗解/