托管视图不会重新绘制视图

我在自定义NSView子类中设置了像这样的图层托管视图:

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

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

这是我的问题:

初始化我的视图后,视图会正确绘制。 但是,当模型发生变化时,我会调用[myCustomView setNeedsDisplay:YES]; 从我的视图控制器drawLayer:inContext不被调用。

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

  • 我必须在图层树中的每个CALayer上调用setNeedsDisplay方法吗?
  • 不应该在图层托管视图本身上调用setNeedsDisplay:YES触发整个图层树的重绘?
  • 谢谢你的帮助。

    编辑

    我在NSView类参考中找到了一些东西

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

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

    链接到文档

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


    在对苹果电脑亭风格菜单的示例代码进行深入研究之后,我发现如果您使用的是图层托管视图,则必须自己处理由于模型更改而需要的屏幕更新。 在NSView上调用setNeedsDisplay:YES不会做任何事情的。

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

    我现在通过在需要recaching的各个CALayer上调用setNeedsDisplay来解决问题。 它工作没有问题。


    还有一个经常使用的实践,有一个空的“drawrect”,la -(void) drawRect:(NSRect)dirtyRect {}帮助强制绘图,我相信通过良好的view.needsDisplay = YES;

    应该指出......确实发生的是 - 通过说你的NSView *view;layer.delegate = view; 导致图层在[layer setNeedsDisplay];时被绘制[layer setNeedsDisplay]; 被称为.... via - (void) drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {...} ..

    沿着同样的脉络...当说layer.layoutManager = view ...后续要求[layer setNeedsLayout]; 只有在实现- (void) layoutSublayersOfLayer:(CALayer *)layer {..}方法时才会实现。

    这些重要的概念在苹果的文档中被掩盖/散布......并且它们对于绝对做任何事情都非常重要。

    链接地址: http://www.djcxy.com/p/74193.html

    上一篇: hosting view does not redraw the view

    下一篇: CALayer is not drawing its content while CABasicAnimation is used