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() } }