我有一个看起来像这样的视图层次结构:
所以基本上我有一个带有子视图的NSSplitView,它包含一个滚动视图(用于表视图)以及一个包含3个子视图的页脚视图 . 需要注意的一些重要事项:
-
使用10.8 base SDK, no auto layout
-
窗口内容视图,拆分视图,滚动和页脚视图的父视图以及滚动视图和页脚视图都是 layer backed ,具有 NSViewContentsRedrawOnSetNeedsDisplay 重绘策略 .
-
NSScrollView
的NSClipView
是一个特殊的子类,它是一个 layer hosting 视图,并使用CAScrollLayer
作为后备层 . -
“颜色视图”是一个具有背景颜色集的简单图层背景视图 .
-
背景视图是一个 layer-hosting 视图,其子内容的属性设置为图像( contentsCenter 也已设置)
-
内容视图是一个 layer backed 容器视图,其中包含单个子视图,自定义 layer backed 按钮视图(不是NSButton) .
-
页脚视图与滚动视图重叠约3个像素
这种布局我的行为非常不稳定 . 以下是我正在获得的三个不同场景,每次启动应用程序时都会随机化 .
1)一切都好看 . 背景视图和所有内容都在那里:
2)按钮显示正常,但背景视图似乎是部分透明的:
3)背景视图显示正常但按钮消失:
绝对没有代码在每个场景之间发生变化 . 我只是停下来再次运行应用程序 . 我确保在运行时我没有更改与不透明度相关的任何内容 . 我在运行时唯一要做的就是在视图上设置背景颜色和图像 .
EDIT: 我有一种感觉,重叠的视图可能会造成麻烦,所以我测试没有重叠并得到相同的结果 .
EDIT 2: 这似乎是图层支持视图层的 zPosition
的问题 . 订单是乱码和随机的 . 如果我手动强制图层的zPosition到正确的值以匹配子视图顺序,那么一切都很好 . 不幸的是,除了设置 zPosition
之外,我找不到更简洁的方法 .
1 回答
这似乎是一个OS X bug . A radar has been filed . 同时,这是我找到的最佳解决方法(其中
view
是所有兄弟视图的超视图):view.subviews = [view.subviews copy]
触发
subviews
的setter会在视图图层上设置正确的zPosition
.