【问题标题】:Layer-backed NSView rotation and skewed siblings支持层的 NSView 旋转和倾斜的兄弟姐妹
【发布时间】:2013-02-04 02:35:48
【问题描述】:

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

问题

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

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

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

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

最奇怪的事

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

在我的应用程序中,当用户单击项目时会出现特殊的子视图,即兄弟被添加到父视图中的时刻。

似乎后端层有一些子视图的缓存缓冲区,当根视图旋转时,其中一些被计算为错误的大小。

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

  1. 视图非常简单和标准,我尝试将[view setWantsLayer:YES] 推送到层次结构的根视图:滚动视图, 剪辑视图,文档视图,每次结果都是一样的。不 手工制作的图层,没有图层主机。
  2. 内容视图、同级视图以及实际上整个视图树(上述视图除外)没有层。虽然,我尝试为各种项目打开图层但没有成功。
  3. 我尝试强制更新 (setNeedsDisplay) 后端层,但没有成功
  4. 完全重新设置图层似乎可以正常工作,但会滞后。

解决办法?

实际上,这就是问题所在。有人遇到过这样的问题吗?也许有人知道强制层删除所有缓存并完全更新的方法?到目前为止,我只有两个解决方案:要么完全删除图层(有效,但也可以转动所有的眼睛糖果),或者重新设置图层调用setWantsLayer:NO,然后调用setWantsLayer:YES。这个性能很差。

【问题讨论】:

  • 你有没有解决过这个问题?我也遇到了同样的问题。
  • 不,我只有问题最后一部分中提到的“解决方案”。 IE。图层重新设置或完全删除图层,在我的应用程序中,我实际上避免为这个特定的视图层次结构使用图层。
  • 小牛队还会出现这个bug吗?
  • 您能否提供一些显示此问题的示例代码?
  • 已经有一段时间了,我没有测试代码来重现这个问题。我花了很多时间寻找解决方案并最终关闭了层,因为这是唯一可行的方法……不幸的是,该项目太大而无法剪切代码示例,现在我无法确认是否存在错误仍然存在于最新的操作系统版本中。

标签: macos cocoa calayer nsview


【解决方案1】:

你写过你尝试过“setNeedsDisplay”。你是从主线程调用这个方法吗?在我的一个应用程序中,如果我从另一个线程调用 setNeedsDisplay,则什么也没有发生。如果您想确保显示无效,请像这样使用调度:

dispatch_async(dispatch_get_main_queue(), ^{

       [view setNeedsDisplay:YES];
});

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

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

【讨论】:

    猜你喜欢
    • 2012-05-30
    • 2017-08-18
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多