SwiftUIで共有メニューを表示する
アプリのコンテンツをメールやSNS等の外部サービスに渡す共有メニューをSwiftUIで表示する方法です。
共有メニュー表示用Viewの定義
UIKitではUIActivityViewControllerを使用して表示するこの共有メニューですが、現状SwiftUIで特に専用のViewがある訳ではないようです。 そのため、UIViewControllerRepresentableプロトコルに準拠させる形でUIActivityViewControllerをSwiftUI上に表示出来るようにします。
struct ActivityView: UIViewControllerRepresentable { let activityItems: [Any] let applicationActivities: [UIActivity]? func makeUIViewController( context: UIViewControllerRepresentableContext<ActivityView> ) -> UIActivityViewController { return UIActivityViewController( activityItems: activityItems, applicationActivities: applicationActivities ) } func updateUIViewController( _ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext<ActivityView> ) { // Nothing to do } }
共有メニュー表示
表示の際はsheet()
を使用し、先ほど作成したUIViewControllerRepresentableプロトコルに準拠したViewを返すようにすれば共有メニューが表示されます。
@State private var showActivityView: Bool = false var body: some View { ... Button(action: { self.showActivityView = true }) { Image(systemName: "square.and.arrow.up") } .sheet(isPresented: self.$showActivityView) { ActivityView( activityItems: ["abc"], applicationActivities: nil ) } ... }