首页 文章

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

提问于
浏览
8

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

enter image description here

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

  • 使用10.8 base SDK, no auto layout

  • 窗口内容视图,拆分视图,滚动和页脚视图的父视图以及滚动视图和页脚视图都是 layer backed ,具有 NSViewContentsRedrawOnSetNeedsDisplay 重绘策略 .

  • NSScrollViewNSClipView 是一个特殊的子类,它是一个 layer hosting 视图,并使用 CAScrollLayer 作为后备层 .

  • “颜色视图”是一个具有背景颜色集的简单图层背景视图 .

  • 背景视图是一个 layer-hosting 视图,其子内容的属性设置为图像( contentsCenter 也已设置)

  • 内容视图是一个 layer backed 容器视图,其中包含单个子视图,自定义 layer backed 按钮视图(不是NSButton) .

  • 页脚视图与滚动视图重叠约3个像素

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

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

enter image description here

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

enter image description here

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

enter image description here

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

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

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

1 回答

  • 2

    这似乎是一个OS X bug . A radar has been filed . 同时,这是我找到的最佳解决方法(其中 view 是所有兄弟视图的超视图):

    view.subviews = [view.subviews copy]

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

相关问题