我正在尝试从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")!])
}
有没有办法像平常一样呈现它?就像覆盖一半的屏幕一样?
答案 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)
}
}
答案 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的操作并在其上打电话。