drawRect:和layoutSubview的区别
开宗明义,
drawRect:和layoutSubview的区别点有很多。但是,比较关心的是用法上的区别:
虽然平时要自定义绘图比较少,毕竟有UI切图,但是要自定义绘图(比如,CALayer)时二者中只能用drawRect,这是二者用法上最大的区别。
1.drawRect:(方便视图重绘)
显示(setNeedsDisplay)---------->重绘矩形(drawRect,前提rect不为0)------------------->拿到画板-------------->画图:
1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。
2、若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕
2.layoutSubViews:(方便数据计算,弥补autoresizing功能的不足)
布局------------->布局子视图------------------->处理子视图的数据
内部调用用,外部更新frame时,建议写新的方法,而不是用setNeedsLayout,毕竟layoutSubViews有很多地方会调用
内部调用
1.drawRect:
sizeToFit(不应该重写)后自动调用----------->sizeThatFits(可重写,真正起作用是这个)
sizeToFit同时也自动调用--------------------->drawRect(自动布局的雏形)
通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。(从这个功能上讲,有点等同于layoutSubViews)
2.:
setNeedsLayout----------->layoutIfNeeded + (刷新标记)----------->layoutSubviews