macOS ステータス バーでのみ実行される macOS アプリがあります。Info.plist の「Application is agent (UIElement)」プロパティを「YES」に変更しました。
<key>LSUIElement</key>
<true/>
次のように、外観の名前を 5 秒ごとに出力するタイマーがあります。
Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { _ in
let appearance = NSAppearance.currentDrawing()
print(appearance.name)
}
問題
システム設定でダークモードとライトモードを切り替えても、名前は実際には変わりません。アプリケーションの起動時に設定された外観の名前が常に出力されます。
システムの外観の変化を聞く方法はありますか?
ゴール
私の最終目標は、実際には を に描画し、NSAttributedString
それをボタンの画像としてNSImage
使用することです。NSImage
NSStatusItem
let image: NSImage = // generate image
statusItem.button?.image = image
私が使用する属性付き文字列のテキストはUIColor.labelColor
、システムの外観に基づいているはずです。ただし、システムの外観の変更を尊重していないようです。
アプリケーションをダーク モードで起動してからライト モードに切り替えると、次のようになります。
アプリケーションをライト モードで起動してからダーク モードに切り替えると、次のようになります。
サイドノート
を に変えてNSAttributedString
をボタンに直接NSImage
使用しない理由は、ステータス バーに正しく配置されていないためです。NSAttributedString
NSStatusItem
attributedTitle