🦋
SwiftUI: MenuBarExtraの仕様
MenuBarExtra
でRunCatを実装することができるのか知るために仕様を調査する。
-
MenuBarExtra
の中ではAppKitのViewは表示できない(NSViewRepresentable
が無効) -
MenuBarExtra
の中ではアニメーションは不可能(ProgressView
やTimelineView
など動的に変化するものが表示されない) -
MenuBarExtra
のlabel
にはLabel
やText
、Image
が表示可能- ただし、
.tint()
や.foregroundColor()
で色を変更することは不可能 -
.background()
は通用しない -
GeometryReader
を利用しても座標はおろかサイズすら入手不可能
- ただし、
-
MenuBarExtra
に指定するlabel
のImage(name:)
を動的に変更することでキーフレームアニメーションをすることは可能- ただし、画像を変えるスピードに比例してCPU使用率が上がっていく(1秒間に5フレームでも7%ほどでひどい)
-
MenuBarExtra
に指定するlabel
の画像をTemplateにしている場合は強制的にアルファを反映したモノクロ表示になり、Originalにしている場合はオリジナルの画像の色のまま表示される(NSStatusBarButton
の時と違ってNSView.draw()
しなくても色褪せたりしない) -
MenuBarExtra
のアイコンは.environment(\.displayScale, 2.0)
を指定しないと解像度が悪くなってしまう -
MenuBarExtra
のcontent
にButton
やMenu
をVStack
で入れることでよくあるメニューを実装することが可能- Separatorを入れたいときは
Divider()
を使えばいい
- Separatorを入れたいときは
-
.menuBarExtraStyle(.window)
を付与することで、メニューアイコンの下にウインドウ領域を展開できる- このウインドウ領域の中では
ProgressView
のアニメーションは有効で、NSViewRepresentable
も機能する
- このウインドウ領域の中では
Discussion