NSSplitViewController导致包含的视图在窗口角上绘制

时间:2016-04-06 23:55:10

标签: macos cocoa xcode-storyboard nssplitviewcontroller

我正在尝试使用Cocoa创建一个小的Finder克隆。我正在放置一个源列表表视图(用作侧边栏)和NSSplitView内部由NSSplitViewController控制的标准表视图。 不幸的是,当我运行它时,标准表视图的白色背景绘制在窗口的右下角,从而产生一个非圆角: Bottom right corner drawn over

我可以通过不使用标准nib文件或故事板的NSSplitViewController来避免此问题,以获得所需的结果:

Correctly drawn, albeit without NSSplitViewController

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

Here is the Xcode workspace with the projects截图。

2 个答案:

答案 0 :(得分:3)

我已经看到了这样的问题而且它似乎是真正的错误。但是有解决方法。您需要确保NSSplitViewController在视图中呈现自己由CA层支持。因此,为了在您的项目中执行此操作,我添加了具有容器视图的中间视图控制器。然后我将拆分视图放在此容器视图中。最后,容器视图的父视图设置为图层备份。这是图片:

enter image description here

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

enter image description here

另一方面:确保在真正需要之前不要使用1000个优先级约束。我通常使用750(我也固定了)。否则你会得到很多关于不可满足的事情的警告。

这是你修复的项目: https://github.com/emankovski/splitviewroundcorrners

答案 1 :(得分:1)

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

实施例。这有效。经测试并确认可在macOS 10.12 Sierra中使用。 Xcode 8.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。)