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

时间:2013-02-19 12:03:38

标签: macos cocoa calayer nsview

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

问题

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

因此,层次结构本身相当简单和常见:带有一些文档的滚动视图,文档子视图代表一些内容。就我而言,它是图形内容,可以旋转。旋转视图可以有一些额外的子视图 - 各种标记,控制点等等,一旦我使用CALayer作为后端,我就会遇到偏斜图形的奇怪问题: Issue illustration

相机照片分别以呈现,它们不是此视图树的一部分,请注意标记和按钮。

正如您在图像上看到的,我有一些带有子视图的测试视图(只是随机按钮)。始终正确呈现右侧的对象。根据我的测试,[0, pi/2]之间的每个NSView与 frameRotation 呈现正常。渲染左侧的对象 模糊,看起来这个项目的缓存缓冲区太小。当 frameRotation 处于[pi/2, pi]范围内时会发生这种情况。

最奇怪的事情

“实时轮换”中不会发生此问题。即如果我只是更改设置层次结构的 frameRoation ,每个子视图就在它的位置,一切正常。但是,将subling添加到已经旋转的对象时 - 它会出现错误并使其模糊不清。

在我的应用程序中,当用户点击该项目时,会出现特殊子视图,即“兄弟姐妹被添加到超级视图中的那一刻。”

看起来后端层有一些用于子视图的缓存缓冲区,并且当根视图旋转时,其中一些缓冲区的计算大小错误。

如何实施?我尝试了什么

  1. 视图非常简单和标准,我试图将[view setWantsLayer:YES]推送到层次结构的根视图:滚动视图, 剪辑视图,文档视图,每个结果都是一样的。没有 手工制作的图层,没有图层主机。
  2. 内容视图,兄弟姐妹和实际上整个视图树(上面提到的视图除外)没有图层。虽然,我试图为各种项目打开层而没有任何成功。
  3. 我试图强制更新(setNeedsDisplay)后端层没有运气
  4. 完全重新设置图层似乎正在起作用,但落后于硬。
  5. 解决方案?

    实际上,这就是问题所在。有人遇到过这样的问题吗?也许有人知道强制图层放弃所有缓存并完全更新的方法?到目前为止,我只有两个解决方案:要么完全丢弃图层(可以工作,也可以转动所有眼睛),或者重新设置调用setWantsLayer:NO后跟setWantsLayer:YES的图层。这个表现糟糕。

1 个答案:

答案 0 :(得分:1)

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

dispatch_async(dispatch_get_main_queue(), ^{

       [view setNeedsDisplay:YES];
});

另外请查看您的IB检查员。有时,图层支持的视图不喜欢与非图层支持的视图混合。确保在" View Effects Inspector"为根层的所有子视图启用了图层支持。

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