2

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使用することです。NSImageNSStatusItem

let image: NSImage = // generate image
statusItem.button?.image = image

私が使用する属性付き文字列のテキストはUIColor.labelColor、システムの外観に基づいているはずです。ただし、システムの外観の変更を尊重していないようです。

アプリケーションをダーク モードで起動してからライト モードに切り替えると、次のようになります。

ダーク-1 ダーク-2

アプリケーションをライト モードで起動してからダーク モードに切り替えると、次のようになります。

光-1 光-2

サイドノート

を に変えてNSAttributedStringをボタンに直接NSImage使用しない理由は、ステータス バーに正しく配置されていないためです。NSAttributedStringNSStatusItemattributedTitle

4

1 に答える 1