NSSplitViewController 导致包含的视图在 window 个角上绘制

NSSplitViewController causing contained views to draw over window corners

我正在尝试使用 Cocoa 创建一个小的 Finder 克隆。我在 NSSplitViewController 控制的 NSSplitView 中放置了一个源列表 table 视图(用作侧边栏)和一个标准 table 视图。 不幸的是,当我 运行 这样做时,标准 table 视图的白色背景绘制在 window 的右下角,导致非圆角:

我可以通过不使用 NSSplitViewController 来避免这个问题,无论是使用标准的 nib 文件还是故事板来获得想要的结果:

但是……我真的很想用NSSplitViewController。有什么办法可以防止这种情况发生吗?

Here is the Xcode workspace with the projects 截图。

我见过这样的问题,它似乎是真正的错误。但是有解决方法。您需要确保 NSSplitViewController 在 CA 层支持的视图中呈现自身。因此,为了在您的项目中执行此操作,我添加了带有容器视图的中间人视图控制器。然后我将你的拆分视图放在这个容器视图中。最后,容器视图的父视图被设置为支持层。这是图片:

之后我可以看到一切正常:

另一个注意事项:确保在真正需要之前不要使用 1000 优先级的约束。我通常使用 750(我也修复了它)。否则你会收到很多关于无法满足的事情的警告。

这是你的固定项目: https://github.com/emankovski/splitviewroundcorrners

确保视图层次结构中的根视图是层支持的将其添加到视图层次结构之前。

例子。这行得通。经过测试并确认可在 macOS 10.12 Sierra 中运行。 Xcode8.0.

split.view.wantsLayer = true
window.contentViewController = split
split.splitViewItems = [
    NSSplitViewItem(viewController: vc),
]

但这不是。

window.contentViewController = split
split.splitViewItems = [
    NSSplitViewItem(viewController: vc),
]
split.view.wantsLayer = true

我不知道这里发生了什么,也不知道为什么会这样。但让我推测一下。

NSWindow 没有图层支持根视图只是天真地绘制,没有涉及合成器。所以他们不能遮住角落,这样的伪影就会出现。只要让它们有图层支持就可以让它发挥作用。就像@Eugene 指出的那样。

让所有东西都支持层并不难。只需将根视图设置为图层支持,层次结构中的每个子视图都将图层支持到叶子。 (RTFM 的详细信息:CALayer.wantsLayer。)