【问题标题】:Erratic behaviour with layer backed/layer hosting NSViews层支持/层托管 NSView 的不稳定行为
【发布时间】:2012-12-20 14:29:48
【问题描述】:

我的视图层次结构如下所示:

所以基本上我有一个带有子视图的 NSSplitView,其中包含一个滚动视图(用于表格视图)以及一个包含 3 个子视图的页脚视图。需要注意的一些重要事项:

  • 使用 10.8 基础 SDK,无自动布局
  • 窗口内容视图、拆分视图、滚动视图和页脚视图的父视图以及滚动视图和页脚视图都是 layer backed 并带有 NSViewContentsRedrawOnSetNeedsDisplay重绘政策。
  • NSScrollViewNSClipView 是一个特殊的子类,它是一个layer hosting 视图并使用CAScrollLayer 作为支持层。
  • Color View 是一个简单的图层支持视图,具有背景颜色集。
  • Background View 是一个 layer-hosting 视图,其子图层的 contents 属性设置为图像(contentsCenter 也已设置)
  • Content View 是一个 layer backed 容器视图,它包含一个子视图,一个自定义 layer backed 按钮视图(不是 NSButton) .
  • 页脚视图与滚动视图重叠约 3 个像素

这种布局的行为非常不稳定。以下是我得到的三种不同场景,每次启动应用程序时都会随机化。

1) 一切正常。背景视图和所有内容都在那里:

2) 按钮看起来不错,但背景视图似乎是部分透明的:

3) 背景视图正常显示,但按钮不见了:

在这些场景之间绝对没有代码发生变化。我只是停止并再次运行该应用程序。我确保我不会在运行时更改与不透明度相关的任何内容。我在运行时唯一要做的就是在视图上设置背景颜色和图像。

编辑:我感觉重叠的视图可能会造成麻烦,所以我在没有重叠的情况下进行了测试,得到了相同的结果。

编辑 2: 这似乎是层支持视图的层的zPosition 的问题。顺序是加扰和随机的。如果我手动将图层的 zPosition 强制为正确的值以匹配子视图顺序,那么一切都很好。不幸的是,我找不到比设置zPosition 更简洁的方法。

【问题讨论】:

  • 您运行的是 OS X 的 Beta 版吗?在 10.8.3 测试版下,我在层和层支持的东西方面有过一些非常糟糕的经历。

标签: objective-c cocoa core-animation calayer nsview


【解决方案1】:

这似乎是一个 OS X 错误。 A radar has been filed。同时,这是我发现的最佳解决方法(view 是所有兄弟视图的父视图):

view.subviews = [view.subviews copy]

触发subviews 的设置器会在视图层上设置正确的zPosition

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2013-06-16
    • 2013-07-04
    相关资源
    最近更新 更多