はじめに
macOS MojaveになってからDark Modeが話題になっていますが,アプリを作る側としては,こちらへの対応で忙しいですね.
さて,ライトモードとダークモードのテーマ切り替えを検出する方法を見つけましたのでまとめておきます.
※Mojave以降のmacOSでないと動かないことに気づきました.
ソース(Mojave以降,表示中のView向け)
NSViewのサブクラス
class customView: NSView {
private var currentAppearance: NSAppearance.Name!
required init?(coder decoder: NSCoder) {
super.init(coder: decoder)
currentAppearance = self.effectiveAppearance.name
}
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
currentAppearance = self.effectiveAppearance.name
}
override func viewDidChangeEffectiveAppearance() {
if currentAppearance != self.effectiveAppearance.name {
currentAppearance = self.effectiveAppearance.name
//外観モードが切り替わった時の処理
}
}
}
ソース(万能)
let center = DistributedNotificationCenter.default()
let userDefaults = UserDefaults.standard
override func viewDidLoad() {
let name = "AppleInterfaceThemeChangedNotification"
center.addObserver(self, selector: #selector(self.refreshDarkMode(_:)),
name: NSNotification.Name(rawValue: name), object: nil)
}
@objc func refreshDarkMode(_ sender: NSNotification) {
let currentStyle = userDefaults.string(forKey: "AppleInterfaceStyle") ?? "Light"
Swift.print(currentStyle)
}