Цвет фона NSPopover (включая треугольник) с темным режимом macOS Mojave - PullRequest
0 голосов
/ 12 октября 2018

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 ), а not viewDidMoveToWindow():

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

Кто-нибудь нашел надежный способ покрасить фон NSPopover (включая его треугольник)) и он работает без проблем на MacOS Mojave?

1 Ответ

0 голосов
/ 12 октября 2018

Забавно, как написание вашего вопроса приводит к решению (иногда быстро).Я понял, что мне нужно создать еще один подкласс 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()
  }
}
...