我想创建一个自定义的NSView,它采用分层的绘画方法。我想大多数图层的宽度和高度都与背景视图相同。
使用像CALayer这样的核心动画类来完成这项任务是否合适,即使我不希望需要太多动画?有更合适的方法吗?
为了澄清,该视图并不像在类似Photoshop的应用程序中的画布。它更像是一个允许用户交互(选择,移动,滚动等)的数据显示。
答案 0 :(得分:3)
如果是你的显示和布局,我会说基于CALayer的架构是一个不错的选择。对于开源Core Plot framework,我们构建了CALayers中的所有图形和绘图元素,并将它们组织在一个常规层次结构中。 CALayers是轻量级的,在Mac和iPhone之间使用几乎相同的API。它们甚至可以用来响应触摸或鼠标事件。
对于基于CALayer的用户界面的另一个示例,my iPhone application的整个等式输入界面由CALayers组成,包括从下方滑动的菜单。性能稍好于我之前基于UIView的实现,但相同的代码也适用于我的应用程序的初步桌面版本。
答案 1 :(得分:2)
对于绘图程序,我认为保持位图数据的缓冲区很重要。使用CALayer
的唯一问题是contents
属性是CGImageRef
。要将其转换为图形上下文以进行进一步绘制可能会有点痛苦。您必须初始化一个新的上下文,将位图数据绘制到其中,然后执行您想要执行的任何绘图操作,最后将其转换回CGImageRef
。您可能无法避免执行大量非常大的内存分配,这几乎可以保证您的程序速度降低。
我会考虑为每一层保留一个屏幕外缓冲区。看一下Quartz CGLayerRef
对象。我认为它可能会做你想做的事情:它是一个屏幕外缓冲区,可以保存您可能想要重复绘制的内容。您也可以在需要时快速获得CGContextRef
,以便进行额外的绘图。如果您想使用Cocoa绘图方法,则可以始终将CGContextRef
与NSGraphicsContext
一起使用。