层支持/层托管NSView的不稳定行为

时间:2013-01-06 20:02:01

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

我有一个看起来像这样的视图层次结构:

enter image description here

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

  • 使用10.8基本SDK,无自动布局
  • 窗口内容视图,拆分视图,滚动和页脚视图的父视图以及滚动视图和页脚视图都是图层支持,带有 NSViewContentsRedrawOnSetNeedsDisplay 重绘政策。
  • NSClipView的{​​{1}}是一个特殊的子类,是图层托管视图,并使用NSScrollView作为支持层。
  • 色彩视图是一个简单的图层背景视图,背景颜色设置。
  • 背景视图是一个图层托管视图,其中包含一个内容属性设置为图像的子图层( contentsCenter 也设置)
  • 内容视图图层支持容器视图,其中包含单个子视图,自定义图层支持按钮视图(不是NSButton)
  • 页脚视图与滚动视图重叠约3个像素

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

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

enter image description here

2)按钮显示正常,但背景视图似乎部分透明:

enter image description here

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

enter image description here

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

编辑:我感觉重叠的视图可能会造成麻烦,所以我测试时没有重叠并得到相同的结果。

编辑2:这似乎是图层支持视图图层的CAScrollLayer存在问题。订单是乱码和随机的。如果我手动强制图层的zPosition到正确的值以匹配子视图顺序,那么一切都很好。不幸的是,除了设置zPosition之外,我找不到更简洁的方法。

1 个答案:

答案 0 :(得分:2)

这似乎是OS X的错误。 A radar has been filed。同时,这是我找到的最好的解决方法(其中view是所有兄弟视图的超级视图):

view.subviews = [view.subviews copy]

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