我有一个奇怪的问题,支持图层的NSView和它的兄弟姐妹,当添加到附加到旋转的超视图的现有视图层次结构中时,其中一些不能正确呈现 . 以下是详细信息 .
问题
- NSScrollView (layer can be here)
- NSClipView (or here)
- Document View (or even here)
- Some *rotated* subview
- { Problematic sublings }
因此,层次结构本身相当简单和常见:带有一些文档的滚动视图,文档子视图代表一些内容 . 在我的情况下,一旦我使用CALayer作为后端,我面临着扭曲图形的奇怪问题:
相机图片是单独渲染的,它们不是此视图树的一部分,请注意标记和按钮 .
正如您在图像上看到的,我有一些带有子视图的测试视图(只是随机按钮) . 始终正确呈现右侧的对象 . 根据我的测试,每个NSView与frameRotation之间的 [0, pi/2]
呈现OK . 左侧的对象呈现模糊,看起来此项的缓存缓冲区太小 . 当frameRotation在 [pi/2, pi]
范围内时会发生这种情况 .
最奇怪的事情
"real-time rotation"中不会发生此问题 . 即如果我只是改变设置层次结构的frameRoation,每个子视图就在它的位置,一切正常 . 然而, when subling are added to the already rotated object - 它的错误并给出了这种模糊的外观 .
在我的应用程序中,当用户点击项目时,会出现特殊子视图,即“兄弟姐妹被添加到超级视图中的那一刻” .
看起来后端层有一些用于子视图的缓存缓冲区,其中一些在旋转根视图时使用错误的大小进行计算 .
如何实施,我尝试了什么
-
视图非常简单和标准,我试图将
[view setWantsLayer:YES]
推送到层次结构的根视图:滚动视图,剪辑视图,文档视图,每个结果都是相同的 . 没有手工制作的层,没有层主机 . -
内容视图,兄弟节点和实际上整个视图树(上面提到的视图除外)没有图层 . 虽然,我试图为各种项目打开层而没有任何成功 .
-
我试图强制更新(setNeedsDisplay)后端层没有运气
-
完全重新设置图层似乎工作正常,但落后于难 .
解决方案?
实际上,这就是问题所在 . 有人遇到过这样的问题吗?也许有人知道强制图层放弃所有缓存并完全更新的方法?到目前为止,我只有两个解决方案:要么完全丢弃图层(工作,但也要转动所有的眼睛),或者重新设置调用 setWantsLayer:NO
的图层,然后再调整 setWantsLayer:YES
. 这个表现糟糕 .
1 回答
你写过你尝试过“setNeedsDisplay” . 你是从主线程调用这个方法吗?在我的一个应用程序中,如果我从另一个线程调用setNeedsDisplay,则没有任何反应 . 如果要确保显示无效,请使用如下调度:
另外,请查看您的IB检查员 . 有时,图层支持的视图不喜欢与非图层支持的视图混合 . 确保在根视图的所有子视图中打开了“视图效果检查器”图层支持 .
(在我的程序中,如果关闭图层支持,NSButton有时会消失)