🔘

SwiftUI.Menuは、UIButtonである

2023/10/23に公開

ここに、2つのUIコンポーネントであるButtonとMenuがあります。

struct ContentView: View {
    var body: some View {
        VStack {
            Button(action: {}, label: {
                Text("Button")
            })
            Menu(content: {}, label: {
                Text("Menu")
            })
        }
    }
}

見た目こそ同じではありますが、実はその構造に大きな違いがあります。

まずは、drawingGroup()を使って、VStackのレンダリングをまとめてみましょう。

すると、Menuのレンダリングが出来なくなってしまいました。

drawingGroup()のドキュメントによると、
https://developer.apple.com/documentation/swiftui/view/drawinggroup(opaque:colormode:)

Views backed by native platform views may not render into the image. Instead, they log a warning and display a placeholder image to highlight the error.

と書かれています。MenuはSwiftUIの標準コンポーネントであるはずですが、native platform viewsということなのでしょうか?

そこで、Xcode view hierarchy debuggerを覗いてみると…

UIButtonが現れました。つまり、SwiftUI.MenuUIButtonを使って実装されたViewであることがわかりました。

これのせいで少し不都合があるのですが、その話は別の機会に…

Discussion