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

Gob*_*bra 56 macos cocoa calayer nsview

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

问题

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

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

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

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

最奇怪的是

在"实时轮换"中不会发生此问题.即如果我只是更改设置层次结构的frameRoation,每个子视图就在它的位置,一切正常.但是,当subling被添加到已经旋转的对象时 - 它会出现错误并给出这种模糊的外观.

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

看起来后端层有一些用于子视图的缓存缓冲区,其中一些在旋转根视图时使用错误的大小进行计算.

它是如何实现的以及我尝试了什么

  1. 这些视图非常简单和标准,我试图推动[view setWantsLayer:YES]层次结构的根视图:滚动视图,剪辑视图,文档视图,每个结果都是相同的.没有手工制作的层,没有层主机.
  2. 内容视图,兄弟节点和实际上整个视图树(上面提到的视图除外)没有图层.虽然,我试图为各种项目打开层而没有任何成功.
  3. 我试图强制更新(setNeedsDisplay)后端层没有运气
  4. 完全重新设置图层似乎是有效的,但是很难.

解决方案?

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

Jac*_*rse 1

您已经写道您尝试过“setNeedsDisplay”。你是从主线程调用这个方法吗?在我的一个应用程序中,如果我从另一个线程调用 setNeedsDisplay,则不会发生任何情况。如果您想确保显示无效,请像这样使用调度:

dispatch_async(dispatch_get_main_queue(), ^{

       [view setNeedsDisplay:YES];
});
Run Code Online (Sandbox Code Playgroud)

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

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