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

ind*_*gie 8 cocoa core-animation objective-c calayer nsview

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

在此输入图像描述

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

  • 使用10.8 base SDK,没有自动布局
  • 窗口内容视图,拆分视图,滚动和页脚视图的父视图以及滚动视图和页脚视图都使用NSViewContentsRedrawOnSetNeedsDisplay重绘策略进行图层备份.
  • 所述NSClipViewNSScrollView是一种特殊的子类,是一个层托管视图,并且使用CAScrollLayer作为背衬层.
  • " 颜色视图"是一个简单的图层背景视图,具有背景颜色集.
  • 背景视图是一个层托管具有与一个子层视图内容属性集到的图像(contentsCenter也被设置)
  • 内容的浏览是一种层支持包含单个子视图,定制容器视图层备份按钮视图(不是NSButton).
  • 页脚视图与滚动视图重叠约3个像素

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

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

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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

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

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

ind*_*gie 2

这似乎是 OS X 的一个错误。雷达已备案。与此同时,这是我发现的最佳解决方法(view所有同级视图的超级视图在哪里):

view.subviews = [view.subviews copy]

触发设置器以在视图层上subviews设置正确的值。zPosition