layoutSubviews数据计算/drawRect视图重绘:

layoutSubviews方便数据计算
layoutifneeded也采用了同样的机制来避免资源的重复调用资源浪费! 
drawRect方便视图重绘:
假设采用直接调用drawRect的机制,先考虑这样问题 ,有两个UIViewControllerA和B,A为当前view的viewController,如果此时在A中调用[B.view drawRect],这样B的view无论如何都会调用drawRect的方法重新绘制一遍,这样问题就出来了,有必要吗,毕竟现在显示的是A中的view!B重新绘制一遍就调用了drawRect中的方法,浪费系统资源啊,而通过Displayifneeded,ios会判断需不需要调用drawRect方法,这样就避免了资源的重复调用!

layoutSubviews不触发:
1、初始化init事件的调用不会触发相对应的实例对象值内存中的layoutSubviews事件。
2、元件实例对象值内存中的frame发生变化并且元件实例对象值同时伴随手工触发layoutIfNeeded事件,则会自动触发layoutSubviews事件。

layoutSubviews触发:
1.addSubview:事件的调用会触发所添加的子渲染图实例对象值内存中的layoutSubviews事件。
2.滚动ScrollView滚动渲染图会对直接承载于ScrollView上的直接子层元件内存中的layoutSubviews事件自动触发。
3.旋转Screen会触发ViewController直接绑定的View渲染层图/子层图上内存中的layoutSubviews事件。
4.改变某个View大小的时候也会触发对应父View上内存中的layoutSubviews事件。
5.直接调用layoutSubviews事件。

drawRect事件以下情况会被调用:
1.如果View实例初始化时没有设置rect4元结构体渲染区默认大小,直接导致drawRect事件不被自动调用。drawRect事件的调用是在Controller->loadView事件/ Controller->viewDidLoad事件两方法完成之后正式调用的。
addSubview:事件的调用会触发所添加的子渲染图实例对象值内存中的drawRect事件。
2.先手动调用sizeToFit事件然后系统自动调用drawRect:事件。
3.渲染图设置contentMode属性值为UIViewContentModeRedraw则每次设置或更改frame时自动调用drawRect:。
4.直接调用setNeedsDisplay或setNeedsDisplayInRect:触发drawRect:,但前提条件是rect不能为0。

drawRect方法使用注意点:
1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。
2、若使用calayer绘图,只能在drawInContext: 中(类似鱼drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕

猜你喜欢

转载自blog.csdn.net/yanhaijunyan/article/details/114266450