setNeedsDisplay 和 setNeedsLayout 以及 layoutIfNeeded的爱恨情仇

  1. setNeedsDisplay 和 setNeedsLayout 
              两个方法都是异步执行,setNeedsDisplay会自动调用drawRect方法,从而会从中得到当前上下文UIGraphicsGetCurrentContext进行绘图。而setNeedsLayout会默认调用layoutSubViews方法,进而处理子视图中的一些数据。综上所述,setNeedsDisplay方便绘图,setNeedsLayout方便处理数据。
  2. setNeedsLayout 和 layoutIfNeeded
    调用过setNeedsLayout方法后并不会立刻去执行layoutSubViews方法,而是等drawing cycle循环到达该节点时才会调用layoutSubViews方法进行布局。而如果对象布局设置发生改变后调用layoutIfNeeded方法会立刻重新布局即layoutSubviews方法会立刻被触发。
  3. layoutSubviews方法被调用的情况:
    a.直接调用setNeedsLayout方法时(注:已增加到父视图上).
    b.被增加到父视图上时addSubview(注:size不能为0) .
    c.给当前视图增加addSubview子视图时无论子视图的size是否为0,layoutSubviews都会被调用
    d.view的size发生改变的时候.
    e.滑动UIScrollView时.
    f.旋转Screen时会触发父控件上的layoutSubviews事件.
  4. drawRect方法被调用的情况:
    a.直接调用setNeedsDisplay或者setNeedsDisplayInRect:方法时.
    b.初始化时设置了视图大小时.
    c.调用过sizeToFit方法后.
    d.通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时.

 

你可能感兴趣的:(iOS)