使用MacOS Mojave暗模式的NSPopover背景色(包括三角形)

时间:2018-10-12 00:20:41

标签: macos cocoa appkit nspopover macos-mojave

Swift 4.2,Xcode 10,macOS 10.14

我创建了以下NSView子类,并将其放在情节提要中所有NSPopover实例的根视图上。但是我注意到,当我在macOS Mojave中切换颜色模式(从暗到亮或以其他方式)时,它不会更新我的NSPopover的背景色。

class PopoverMain:NSView{
  override func viewDidMoveToWindow() {
    guard let frameView = window?.contentView?.superview else { return }

    let backgroundView = NSView(frame: frameView.bounds)
    backgroundView.backgroundColor(color: Color(named: "MyColor")!)
    backgroundView.autoresizingMask = [.width, .height]

    frameView.addSubview(backgroundView, positioned: .below, relativeTo: frameView)
  }
}

我认为这是因为颜色模式转换仅调用以下方法(source),而 viewDidMoveToWindow()

  • updateLayer()
  • draw(_:)
  • layout()
  • updateConstraints()

有人能找到一种可靠的方法来给NSPopover(包括其三角形)的背景着色并使其在macOS Mojave上无缝工作吗?

1 个答案:

答案 0 :(得分:3)

有趣的是,如何写下您的问题导致解决方案(有时很快)。我意识到我需要创建另一个NSView子类,该子类负责生成NSView并加载到NSPopover中。请注意PopoverMainView类的添加:

class PopoverMain:NSView{
  override func viewDidMoveToWindow() {
    guard let frameView = window?.contentView?.superview else { return }

    let backgroundView = PopoverMainView(frame: frameView.bounds)
    backgroundView.autoresizingMask = [.width, .height]
    frameView.addSubview(backgroundView, positioned: .below, relativeTo: frameView)
  }
}

class PopoverMainView:NSView {
  override func draw(_ dirtyRect: NSRect) {
    Color(named: "MyColor")!.set()
    self.bounds.fill()
  }
}