📤
[SwiftUI] iPad でもUIActivityViewController を使う
コンテンツを共有する機能のためにUIActivityViewController
を使いたかったのですが、iPad の時にどうするか困ったのでメモ。
iPhone の場合
SwiftUI でも、window のrootViewController
やpresentedViewController
からUIActivityViewController をpresent することで、OS のシェアシートを呼ぶことが出来ました。
iPad の場合
問題
iPad の場合はこのままだとクラッシュしてしまいます。
UIActivityViewController の popoverPresentationController?.sourceView
とpopoverPresentationController?.sourceRect
を指定する必要があるのですが、SwiftUI のView からそれらをどうやってやるのかで困りました。
解決方法
UIViewControllerRepresentable
を利用することで、iPad でもUIActivityViewController を使うことが出来ました。
import UIKit
import SwiftUI
struct ActivityViewController: UIViewControllerRepresentable {
var activityItems: [Any]
var applicationActivities: [UIActivity]? = nil
func makeUIViewController(context: UIViewControllerRepresentableContext<ActivityViewController>) -> UIActivityViewController {
let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: applicationActivities)
return controller
}
func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext<ActivityViewController>) {}
}
@State private var showingActivityView = Bool(false)
var body: some View {
YourView()
.background(EmptyView().sheet(isPresented: $showingActivityView, content: {
ActivityViewController(activityItems: activityItems)
}))
}
private func didTapActionButton() {
if isIPad() {
showingActivityView = true
} else {
//
}
}
参考
Showing 'UIActivityViewController' in SwiftUI - Stack Overflow
Discussion