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