cocoa – 在图层托管视图上调用setNeedsDisplay:YES不会重绘视图

cocoa – 在图层托管视图上调用setNeedsDisplay:YES不会重绘视图,第1张

概述我在自定义NSView子类中设置了这样的图层托管视图: [self setLayer:rootLayer];[self setWantsLayer:YES]; 在每个子图层上调用setNeedsDisplay后,我将所有子图层添加到图层树中.每个图层的内容由我的图层委托的drawLayer:inContext方法提供. 这是我的问题: 初始化视图后,视图会正确绘制.但是,当模型发生变化时我调用[ 我在自定义NSVIEw子类中设置了这样的图层托管视图:

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

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

这是我的问题:

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

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

>我是否必须在图层树中的每个CALayer上调用setNeedsdisplay方法?
>不应该在图层托管视图本身上调用setNeedsdisplay:YES来触发整个图层树的重绘吗?

谢谢你的帮助.

编辑

我在NSVIEw Class引用中找到了一些东西

A layer-backed vIEw is a vIEw that is backed by a Core Animation layer. Any drawing done by the vIEw is the cached in the backing layer. You configured a layer-backed vIEw by simply invoking setWantsLayer: with a value of YES. The vIEw class will automatically create the a backing layer for you,and you use the vIEw class’s drawing mechanisms. When using layer-backed vIEws you should never interact directly with the layer.

A layer-hosting vIEw is a vIEw that contains a Core Animation layer that you intend to manipulate directly. You create a layer-hosting vIEw by instantiating an instance of a Core Animation layer class and setting that layer using the vIEw’s setLayer: method. After doing so,you then invoke setWantsLayer: with a value of YES. When using a layer-hosting vIEw you should not rely on the vIEw for drawing,nor should you add subvIEws to the layer-hosting vIEw.

link to documentation

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

解决方法 在Apple的 sample code自助式菜单中进一步研究后,我发现如果您使用的是图层托管视图,则必须自行处理由于模型更改而需要的屏幕更新.在NSVIEw上调用setNeedsdisplay:YES将不会执行任何 *** 作.

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

我现在通过在需要重新缓存的单个CALayers上调用setNeedsdisplay来解决问题.它没有问题.

总结

以上是内存溢出为你收集整理的cocoa – 在图层托管视图上调用setNeedsDisplay:YES不会重绘视图全部内容,希望文章能够帮你解决cocoa – 在图层托管视图上调用setNeedsDisplay:YES不会重绘视图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1024356.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存