🦋

SwiftUI: MenuBarExtraにはAppKitのViewは表示できない

2022/12/08に公開

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