从SwiftUI视图呈现UIActivityViewController

时间:2019-10-08 12:26:03

标签: ios swiftui

我正在尝试从SwiftUI视图中显示一个UIActivityViewController(共享表)。我创建了一个符合ShareSheet的名为UIViewControllerRepresentable的视图来配置UIActivityViewController,但事实证明,实际呈现此视图并不那么简单。

struct ShareSheet: UIViewControllerRepresentable {
    typealias UIViewControllerType = UIActivityViewController

    var sharing: [Any]

    func makeUIViewController(context: UIViewControllerRepresentableContext<ShareSheet>) -> UIActivityViewController {
        UIActivityViewController(activityItems: sharing, applicationActivities: nil)
    }

    func updateUIViewController(_ uiViewController: UIActivityViewController, context: UIViewControllerRepresentableContext<ShareSheet>) {

    }
}

通过.sheet天真地这样做会导致以下结果。

.sheet(isPresented: $showShareSheet) {
    ShareSheet(sharing: [URL(string: "https://example.com")!])
}

screenshot of failed controller presentation

有没有办法像平常一样呈现它?就像覆盖一半的屏幕一样?

3 个答案:

答案 0 :(得分:6)

希望这对您有帮助,

struct ShareSheetView: View {
    var body: some View {
        Button(action: actionSheet) {
            Image(systemName: "square.and.arrow.up")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 36, height: 36)
        }
    }
    
    func actionSheet() {
        guard let data = URL(string: "https://www.apple.com") else { return }
        let av = UIActivityViewController(activityItems: [data], applicationActivities: nil)
        UIApplication.shared.windows.first?.rootViewController?.present(av, animated: true, completion: nil)
    }
}

enter image description here

答案 1 :(得分:1)

有一个UIModalPresentationStyle可用于显示某些演示文稿:

case pageSheet

  

一种表示样式,部分覆盖了基础内容。

应用演示样式的方式:

func makeUIViewController(context: UIViewControllerRepresentableContext<ActivityView>) -> UIActivityViewController {
    let v = UIActivityViewController(activityItems: sharing, applicationActivities: nil)
    v.modalPresentationStyle = .pageSheet
    return v
}

可以在此处找到演示文稿列表:

https://developer.apple.com/documentation/uikit/uimodalpresentationstyle

我还没有对它们全部进行测试,因此如果无法按您预期的那样工作,我会提前道歉。

或者,您可以在this answer上看到他们提到的第三方库,该库允许您以通常显示的方式创建半模态。

答案 2 :(得分:0)

它并不漂亮,但是您可以像这样直接调用它(考虑到您的应用程序只有一个窗口):

UIApplication.shared.windows.first?.rootViewController?.present(activityViewController, animated: true, completion: nil)

如果您收到警告,请blablabla:

  

警告:尝试演示...已经在演示中...

您可以执行类似this to get the top most view controller的操作并在其上打电话。