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
  1. layoutSubviews调用时机(系统调用)
    直接调用[self setNeedsLayout];
    initWithframe:如果初始frameCGRectZero则不调用,否则调用
    addSubview的时候。
    viewsize发生改变的时候,前提是frame的值设置前后发生变化
    滑动UIScrollView的时候。
    旋转Screen会触发父View上的layoutSubviews事件**(待验证,作者说验证过没有触发)

  2. setNeedsDisplay调用时机
    该方法在调用时,会自动调用drawRect方法。drawRect方法主要用来画图。
    so:
    当需要刷新布局时,用setNeedsLayOut方法;
    当需要重新绘画时,调用setNeedsDisplay方法。

粗浅的总结

总的来说:我们可以重写父类的layoutSubviewsdrawRect 方法,但是我们不能手动调用它们,而是需要分别调用setNeedsLayoutsetNeedsDisplay这两个方法来触发。


View的Layout方法粗解
http://example.com/2018/08/28/View的Layout方法粗解/
Author
John Doe
Posted on
August 28, 2018
Licensed under