1

我想创建一个采用分层绘画方法的自定义 NSView。我想大多数图层的宽度和高度与背景视图相同。

即使我不希望需要太多动画,使用像 CALayer 这样的核心动画类来完成这个任务是否合适?有没有更合适的方法?

需要澄清的是,视图并不意味着像 Photoshop 类应用程序中的画布。它更像是一种数据显示,应该允许用户交互(选择、移动、滚动等)

4

2 回答 2

3

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

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

于 2009-07-31T20:24:13.170 回答
2

对于绘图程序,我想保留位图数据的缓冲区很重要。使用 a 的唯一问题CALayercontents属性是 a CGImageRef。将其转换回图形上下文以进行进一步的绘图可能有点痛苦。您必须初始化一个新上下文,将位图数据绘制到其中,然后执行您想要执行的任何绘制操作,最后将其转回CGImageRef. 您可能无法避免进行大量相当大的内存分配,这几乎可以保证会减慢您的程序速度。

我会考虑为每一层保留一个屏幕外缓冲区。看一下 QuartzCGLayerRef对象。我认为它可能会做您想做的事情:它是一个屏幕外缓冲区,可以保存您可能想要重复绘制的内容。您还可以CGContextRef在需要时快速获取它,以便您可以进行额外的绘图。如果你想使用 Cocoa 绘图方法CGContextRef,你可以随时使用它。NSGraphicsContext

于 2009-07-30T14:45:23.777 回答