SwiftUI シェアボタン

2020年1月17日

SwiftUIで共有メニューを表示する – ttlog

共有メニュー表示用Viewの定義
UIKitではUIActivityViewControllerを使用して表示するこの共有メニューですが、現状SwiftUIで特に専用のViewがある訳ではないようです。 そのため、UIViewControllerRepresentableプロトコルに準拠させる形でUIActivityViewControllerをSwiftUI上に表示出来るようにします。

struct ActivityView: UIViewControllerRepresentable {

    let activityItems: [Any]
    let applicationActivities: [UIActivity]?

    func makeUIViewController(
        context: UIViewControllerRepresentableContext
    ) -> UIActivityViewController {
        return UIActivityViewController(
            activityItems: activityItems,
            applicationActivities: applicationActivities
        )
    }

    func updateUIViewController(
        _ uiViewController: UIActivityViewController,
        context: UIViewControllerRepresentableContext
    ) {
        // 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
        )
    }
    ...
}

SwiftUIでViewを画像としてUIActivityを利用してSNSに共有する – Qiita

How can create a share sheet/view with SwiftUI … |Apple Developer Forums