2010-09-05 37 views
7

我有一个层托管视图在一个定制NSView子类设置是这样的:调用setNeedsDisplay:YES上层托管视图不重绘视图

[self setLayer:rootLayer]; 
[self setWantsLayer:YES]; 

我所有的子层添加到层树在每个子图层上调用setNeedsDisplay之后。每个图层的内容由我的图层委托的drawLayer:inContext方法提供。

这里是我的问题:

初始化我的观点后认为得到正确绘制。但是,当模型发生变化时,我从视图控制器呼叫[myCustomView setNeedsDisplay:YES];,则不会调用drawLayer:inContext

我很困惑,现在如何更新视图:

  • 我必须呼吁各的CALayer的setNeedsDisplay方法层树?
  • 在图层托管视图上不应该调用setNeedsDisplay:YES本身触发整个图层树的重绘?

感谢您的帮助。

编辑

我已经发现一些在的NSView类引用

阿层支持的观点是,通过核心动画层支持的图。任何由视图完成的绘图都会缓存在背景层中。您只需调用setWantsLayer:值为YES来配置层次支持的视图。视图类将自动为您创建一个支持图层,并使用视图类的绘图机制。当使用层次支持的视图时,您不应该直接与图层进行交互。

图层托管视图是包含您打算直接操作的核心动画图层的视图。通过实例化Core Animation图层类的实例并使用视图的setLayer:方法设置该图层,可以创建图层托管视图。完成之后,您将调用setWantsLayer:值为YES。当使用图层托管视图时,您不应该依赖该视图进行绘制,也不应该将子视图添加到图层托管视图。

link to documentation

在我来说,我有一个层托管视图。那么这是否确实意味着我必须手动触发重绘?我是否应该在自定义NSView中实现一个伪drawRect方法来调用更改后的CALayers上的相应setNeedsDisplay?

回答

9

经过对苹果公司的sample code进一步研究,我发现如果您使用图层托管视图,您必须自己处理由于模型更改而需要的屏幕更新。在NSView上调用setNeedsDisplay:YES将不会执行任何操作。

因此,如果必须更新视图,必须编写一个像reloadData这样的方法,并且在每个需要刷新的CALayer上应该调用setNeedsDisplay。我仍然不确定在根层上调用此方法是否会传播所有子层,但我不这么认为。

我现在通过致电setNeedsDisplay解决了个别CALayers需要recaching的问题。它工作没有问题。

+0

您的示例代码链接已损坏,也许这是替换:https://developer.apple.com/library/mac/samplecode/CoreAnimationKioskStyleMenu/Introduction/Intro.html#//apple_ref/doc/uid/ DTS40009512 – 2014-05-16 17:44:23

2

还有有一个空的“的drawRect”,一拉-(void) drawRect:(NSRect)dirtyRect {}帮助强制东西变成图纸,的通过老好人view.needsDisplay = YES;一个经常使用的做法,我相信

和应该注意..什么是确实发生的事情是 - 说出你的NSView *view;layer.delegate = view;导致要绘制的层时[layer setNeedsDisplay];被称为....通过- (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {...} ..

沿同一静脉...说[layer setNeedsLayout];- (void) layoutSublayersOfLayer:(CALayer *)layer {..}方法的实现将只履行layer.layoutManager = view ...后续需求..当

这些重要概念掩盖了/在苹果的文档四散......他们是真的有这么完全可以完成任何工作的关键。

+0

你能否解释一下更多初学者友好的方式。 – carbonr 2015-11-12 07:16:49

+0

@carbonr我知道它很混乱。但我所说的就是这么简单。如果事情没有正确显示,并且你的视图是图层的委托。你需要实现'drawLayer:inContext',也许有一个空的'drawRect:'并且调用'setNeedsDisplay'。如果你必须阅读它10次,但信息都在那里。如果我没有记错,那就是。 ;) – 2015-11-12 07:32:51

相关问题