🦋

SwiftUI: MenuBarExtraの仕様

2022/12/09に公開

MenuBarExtraでRunCatを実装することができるのか知るために仕様を調査する。

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

Discussion