首页 文章

图层支持的NSView旋转和倾斜的兄弟姐妹

提问于
浏览
56

我有一个奇怪的问题,支持图层的NSView和它的兄弟姐妹,当添加到附加到旋转的超视图的现有视图层次结构中时,其中一些不能正确呈现 . 以下是详细信息 .

问题

- NSScrollView (layer can be here)
  - NSClipView (or here)
    - Document View (or even here)
      - Some *rotated* subview
        - { Problematic sublings }

因此,层次结构本身相当简单和常见:带有一些文档的滚动视图,文档子视图代表一些内容 . 在我的情况下,一旦我使用CALayer作为后端,我面临着扭曲图形的奇怪问题:
Issue illustration

相机图片是单独渲染的,它们不是此视图树的一部分,请注意标记和按钮 .

正如您在图像上看到的,我有一些带有子视图的测试视图(只是随机按钮) . 始终正确呈现右侧的对象 . 根据我的测试,每个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 回答

  • 1

    你写过你尝试过“setNeedsDisplay” . 你是从主线程调用这个方法吗?在我的一个应用程序中,如果我从另一个线程调用setNeedsDisplay,则没有任何反应 . 如果要确保显示无效,请使用如下调度:

    dispatch_async(dispatch_get_main_queue(), ^{
    
           [view setNeedsDisplay:YES];
    });
    

    另外,请查看您的IB检查员 . 有时,图层支持的视图不喜欢与非图层支持的视图混合 . 确保在根视图的所有子视图中打开了“视图效果检查器”图层支持 .

    (在我的程序中,如果关闭图层支持,NSButton有时会消失)

相关问题