アプリ開発の逆引き辞典

アプリ開発のTipsをまとめました

SwiftUIで UIActivityViewControllerを使って画像を共有する

iOSで画像やテキストなどを他のアプリへシェアするときには UIActivityViewController を利用する。SwiftUIでも UIActivityViewControllerを使って画像を共有する処理を紹介する。

実行環境

  • Xcode 11.6
  • iOS 13.6

UIActivityViewControllerを使って画像を共有する

SwiftUIでUIActivityViewControllerを使うためのブリッジクラスを作成します。今回は画像だけを共有することを想定しています。

import SwiftUI

public struct ShareActivityView: UIViewControllerRepresentable {
    
    private let images: [UIImage]
    private let onCanceled: () -> Void
    private let onShared: () -> Void
    
    public init(images: [UIImage], onCanceled: @escaping () -> Void, success onShared: @escaping () -> Void) {
        self.images = images
        self.onCanceled = onCanceled
        self.onShared = onShared
    }

    public func makeUIViewController(context: Context) -> UIActivityViewController {
        let activityController = UIActivityViewController(activityItems: images, applicationActivities: nil)
        activityController.completionWithItemsHandler = {
            (activityType, completed, returnedItems, error) in
            if !completed {
                self.onCanceled()
                return
            }
            self.onShared()
        }
        return activityController
    }

    public func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {
    }
}

あとはSwiftUIの画面側でシートに ShareActivityView を表示するだけです!

import SwiftUI

struct SampleActivityView : View {
    
    @State private var sheetIsPresented = false
    
    var body: some View {
        VStack {
            Button(action: {
                self.sheetIsPresented = true
            }, label: { Text("show activity controller") })
        }
        .sheet(isPresented: $sheetIsPresented) {
            ShareActivityView(images: [ R.image.dummy_red()!, R.image.dummy_green()!], onCanceled: {
                // on cancel
            }) {
                // on success
            }
        }
    }
}

struct SampleActivityView_Previews: PreviewProvider {
    static var previews: some View {
        SampleActivityView()
    }
}

f:id:ch3cooh393:20200729210841p:plain