关于calayer
前两天在cocoa china 的微信平台推送消息中无意看到了一个关于优化 uitableviw 的滚动效果。其中在确定cell的样子的时候,提到用calayer 来绘制图片的问题。蓦然发现自己在方面的知识,已经有点模糊了,于是放狗恶补一下。稍微给自己做点记号吧。
1.uiview和calayer 的最大区别就在于layer 的单纯的绘制,他不会接受用户的交互,比如手势啊 什么的。而uiview不同,他本身就是机遇calayer 而来的,可以理解为uivew的在calayer的基础上为 calayer 接受用户交互进行封装之后的类。所以这就存在一个效率的问题。如果你要绘制的数据很多,而又不用交互,那么使用calayer 肯定能提高绘制效率,因为他本来就是为绘制而生的,uiview会因为在内部进行封装的时候消耗时间,而影响效率。而且在我看的那篇文章中说,uiview 在绘制的时候只是用了cpu 进行运算,但calayer在运算时候是 CPU 和GPU 双管齐下,自然更快。
2.如果是自定义一个calayer ,那记得他的绘制方法是在 drawInContext:(CGContextRef)ctx 中。而且,cg
开头的东东,如果是用create 创建了,记得 最后用 release把生成的对象干掉。
3.如果你在calayer 中图层中绘制了图像,那就别在 view的 drawrect 方法中继续绘制别的图像了,因为绘制完了之后,又会被calayer方法中的绘制的图像覆盖。
4,calayer上绘图的两种方法。1)创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D api进行绘图
2)设置CALayer的代理,让代理实现drawLayer:inContext方法进行绘图。一般是在控制器里实现。但这样会增加控制器的负担。
切记:调用这2个方法以后都必须调用setNeedsDisplay方法重新绘制视图,才能生效。