UIView的显示原理

来源:互联网 发布:js百度地图绘制轨迹 编辑:程序博客网 时间:2024/05/03 04:07


UIView的显示过程:

1当UIView需要显示时,它内部的层会准备好一个CGContextRef(图形上下文),然后调用delegate(这里就是UIView)的drawLayer:inContext:方法,并且传入已经准备好的CGContextRef对象。而UIView在drawLayer:inContext:方法中又会调用自己的drawRect:方法

2平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由层传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入层的CGContextRef中,然后被拷贝至屏幕


UIView的显示原理:
1既使不导入QuartzCore框架,NSObject和UIView类中的-drawLayer:inContext:方法,也是存在的,只是没有代码提示而已.
2默认情况下,根图层的delegate就是根图层所在的UIView对象,只不过是弱引用.
@property(assign) id delegate;
3当UIView需要显示时,它内部的view.layer图层会准备好一个CGContextRef关联到图层设备,然后调用view.layer.delegate代理(就是view)的(原生的)-drawLayer:inContext:方法.

原生的-drawLayer:inContext:方法的内部原理:
1>在-drawLayer:inContext:方法的内部,会把接收到的CGContextRef,保存到UIKit环境中,这一步非常重要
2>在-drawRect:方法的内部,会调用UIGraphicsGetCurrentContext(void)函数 ,这个函数的作用是将先前保存在UIKit环境中的CGContextRef取出来.
3>在-drawLayer:inContext:方法的内部,又调用了UIView对象的-drawRect:方法,在-drawRect:方法的内部使用传过来的CGContextRef进行绘图即可.

经过测试:
1既使不导入QuartzCore框架,重写一个空的-drawLayer:inContext:方法,将导致-drawRect:方法中的代码失效,原因是找不到CGContextRef.
2所以,UIView对象的-drawRect:方法,必须基于NSObject对象的-drawLayer:inContext:方法的存在才有效.
0 0