如何为 NSCollectionView 的 "Overshoot" 背景着色

How to Color the "Overshoot" Background of an NSCollectionView

我在 Ray Wenderlich's tutorial 之后的 Cocoa 应用程序上实现了 集合视图 (非常有帮助,考虑到 Apple 的 API就在这个区域)。

在教程中,使用以下代码将集合视图的 canvas 涂成黑色(所有代码都在视图控制器 class' viewDidLoad() 方法中):

collectionView.layer?.backgroundColor = NSColor.black.cgColor

然而,当您使用 - 例如 - 魔法 mouse/scrollwheel 过度("rubber-band")滚动时 "peeks" 的区域仍然是白色的并且非常分散注意力:

我正在尝试将整个内容区域设为黑色。在我的情节提要中,我将包含集合视图的 NSScrollViewNSClipView 的背景颜色设置为黑色,但它不会改变外观。 还尝试了编程替代方案:为滚动视图设置一个出口并调用:

self.scrollview.backgroundColor = NSColor.black
self.scrollview.contentView.backgroundColor = NSColor.black

...没有效果。

此外,我试过:

collectionView.superview?.layer?.backgroundColor = NSColor.black.cgColor

...但这也不起作用。

也没有:

self.view.layer?.backgroundColor = NSColor.black.cgColor

或:

self.view.window?.backgroundColor = NSColor.black

更新:

我已将滚动视图的 背景色 设置为红色,并将 drawsBackground 设置为 true (在 IB 中和以编程方式)。 NSScrollViewbackgroundColor 属性 的文档说:

This color is used to paint areas inside the content view that aren’t covered by the document view.

我已经在运行时验证文档视图确实是我的集合视图:

if scrollview.documentView is NSCollectionView {
        print("Document is collection")
}

但是,没有显示红色,文档以外的区域(集合视图)保持白色。


更新 2: 我启动了 View Hierarchy Debugger,似乎 drawsBackground 的值在运行时为假(我将其设置为 true 代码 故事板中)!:

(虽然背景颜色本身似乎被反射了)

  1. 在 Interface Builder 中,select 文档大纲中的 CollectionView。
  2. 在实用工具 window 中,显示属性检查器。
  3. 在原色select或控件中设置所需的颜色。

注意:您引用的 Ray Wenderlich 教程以编程方式设置集合视图的背景颜色。您要么想要删除该行,要么确保您设置的颜色与您在上面的第 3 步中选择的颜色相同。

用于在 Swift 3 中以编程方式更改它,例如:

collectionView.backgroundColors = [NSColor.black]

只需在 self.collectionView.wantsLayer = true

中更改 self.view.wantsLayer = true