【发布时间】:2011-04-08 13:19:29
【问题描述】:
我在自定义NSView 子类中设置了这样的层托管视图:
[self setLayer:rootLayer];
[self setWantsLayer:YES];
在每个子层上调用setNeedsDisplay 后,我将所有子层添加到层树中。每个层的内容由我层的代理的drawLayer:inContext 方法提供。
这是我的问题:
初始化我的视图后,视图会正确绘制。但是,当模型发生更改并且我从视图控制器调用 [myCustomView setNeedsDisplay:YES]; 时,不会调用 drawLayer:inContext。
我现在很困惑如何更新视图:
- 是否必须在层树中的每个 CALayer 上调用
setNeedsDisplay方法? - 不应该在 layer-hosting view 上调用
setNeedsDisplay:YES本身触发整个 layer 树的重绘吗?
感谢您的帮助。
编辑
我在 NSView 类参考中找到了一些东西
layer-backed view 是由 Core Animation 层支持的视图。视图完成的任何绘图都缓存在支持层中。您只需调用 setWantsLayer: 值 YES 即可配置一个支持层的视图。视图类会自动为您创建一个支持层,并且您使用视图类的绘图机制。使用 layer-backed 视图时,您永远不应该直接与 layer 交互。
layer-hosting view 是一个包含你打算直接操作的 Core Animation 层的视图。您可以通过实例化 Core Animation 图层类的实例并使用视图的 setLayer: 方法设置该图层来创建图层托管视图。完成此操作后,然后调用 setWantsLayer: 值为 YES。使用 layer-hosting view 时,您不应依赖视图进行绘图,也不应将子视图添加到 layer-hosting view。
就我而言,我有一个图层托管视图。那么这是否确实意味着我必须手动触发重绘?我应该在自定义 NSView 中实现一个伪 drawRect 方法以在更改的 CALayers 上调用适当的 setNeedsDisplay 吗?
【问题讨论】:
标签: cocoa core-animation