托管视图不会重新绘制视图
我在自定义NSView
子类中设置了像这样的图层托管视图:
[self setLayer:rootLayer];
[self setWantsLayer:YES];
在每个子图层上调用setNeedsDisplay
之后,我将所有子图层添加到图层树中。 每个图层的内容由我的图层委托的drawLayer:inContext
方法提供。
这是我的问题:
初始化我的视图后,视图会正确绘制。 但是,当模型发生变化时,我会调用[myCustomView setNeedsDisplay:YES];
从我的视图控制器drawLayer:inContext
不被调用。
我现在很困惑如何更新视图:
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