2009-07-30 23 views
1

我想创建一个自定义的NSView,它采用分层的绘画方法。我想大多数图层的宽度和高度与后台视图相同。使用Core Animation/CALayer进行简单的分层绘画

对于这个任务,使用像CALayer这样的核心动画类是否合适,即使我不期望需要太多的动画?有更合适的方法吗?

为了澄清,该视图并不意味着像Photoshop中的应用程序中的画布。它更适合用户交互的数据显示(选择,移动,滚动等)

回答

3

如果是之后的显示和布局,我会说基于CALayer的架构是一个不错的选择。对于开放源代码Core Plot framework,我们将所有图形和绘图元素从CALayers中构建出来,并按常规层次结构进行组织。 CALayers是轻量级的,在Mac和iPhone之间使用几乎相同的API。他们甚至可以响应触摸或鼠标事件。

对于基于CALayer的用户界面的另一个示例,my iPhone application的整个方程式输入界面由CALayers组成,包括从下方向上滑动的菜单。性能稍好于我以前的基于UIView的实现,但相同的代码也适用于我的初步桌面版本的应用程序。

2

对于绘图程序,我会想到保存位图数据的缓冲区是很重要的。使用CALayer唯一的问题是contents属性是CGImageRef。为了进一步绘图而将其转换为图形上下文可能会有点痛苦。你必须初始化一个新的上下文,在其中绘制位图数据,然后进行你想要做的任何绘制操作,最后再把它变回CGImageRef。您可能无法避免执行大量内存分配,这实际上可以保证您的程序运行速度减慢。

我会考虑为每个图层保留一个屏幕外缓冲区。看看石英CGLayerRef对象。我认为它可能做你想做的事:它是一个屏幕外的缓冲区,它包含了你可能想要重复绘制的东西。您也可以在需要时快速获得CGContextRef,以便您可以进行额外的绘图。如果您想使用Cocoa绘图方法,您可以始终使用CGContextRefNSGraphicsContext

+0

谢谢你的回答。 我不确定您的“绘图程序”究竟是什么意思,但要澄清,该视图并不意味着像Photoshop中的应用程序中的画布。它应该允许用户交互(选择,移动,滚动等)的数据显示更多 – 2009-07-30 17:07:07

+0

然后,这取决于您绘制的内容是否可以根据需要轻松快速地重绘,或者这是否是一项耗时的操作。在第一种情况下,Core Animation图层可以正常工作。 CGLayers可以更好地作为高速缓存来重绘。 – Alex 2009-07-30 19:00:11