🦋
SwiftUI: MenuBarExtraにはAppKitのViewは表示できない
macOS VenturaからMenuBarExtra
の登場によって、macOSのメニューバーのUIをSwiftUIで実装できるようになりました。そこで色々実験してみたところ、NSViewRepresentable
を使ってAppKitのViewをラップしてもMenuBarExtra
では表示できないことがわかりました。とても辛いです。
NSViewの例
struct WrappedNSView: NSViewRepresentable {
typealias NSViewType = NSView
func makeNSView(context: Context) -> NSView {
let view = NSView(frame: NSRect(x: 0, y: 0, width: 28, height: 18))
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.red.cgColor
return view
}
func updateNSView(_ nsView: NSView, context: Context) {}
}
MenuBarExtra
@main
struct SampleApp: App {
var body: some Scene {
MenuBarExtra {
WrappedNSView()
} label: {
WrappedNSView() {
}
}
}
メニューバー上のアイコン領域にも、メニューバーアイコンを押して開くメニューにも表示されません。
また、Menuを入れ子にした際も同様で、NSViewRepresentable
で実装されたViewは表示されないみたいです。
Menuを入れ子
@main
struct SampleApp: App {
var body: some Scene {
MenuBarExtra {
Menu {
WrappedNSView()
} label: {
Text("push me")
}
} label: {
WrappedNSView() {
}
}
}
MenuBarExtra
はあくまでフルSwiftUIで記述する必要があるみたいですね。
Discussion