编辑:删除所有代码和对UIButton
.
感谢@Matteo_Pacini 对这个问题的回答,向我们展示了这项技术。与他的回答(和评论)一样,(1)边缘很粗糙,(2)我不确定这是苹果希望我们使用的方式UIViewControllerRepresentable
,我真的希望他们提供更好的SwiftUI
(“SwiftierUI”?)替代品在未来的测试版中。
我做了很多工作,UIKit
因为我希望它在 iPad 上看起来不错,sourceView
弹出框需要 a。真正的技巧是显示一个(SwiftUI) ,它在视图层次结构View
中获取并从.UIActivityViewController
present
UIKit
我的需要是展示一个单一的图像来分享,所以事情就是朝着这个方向发展的。假设您有一个图像,存储为一个@State
变量 - 在我的示例中,该图像称为vermont.jpg,是的,为此进行了硬编码。
首先,创建一个UIKit
`UIViewController 类型的类来显示共享弹出框:
class ActivityViewController : UIViewController {
var uiImage:UIImage!
@objc func shareImage() {
let vc = UIActivityViewController(activityItems: [uiImage!], applicationActivities: [])
vc.excludedActivityTypes = [
UIActivity.ActivityType.postToWeibo,
UIActivity.ActivityType.assignToContact,
UIActivity.ActivityType.addToReadingList,
UIActivity.ActivityType.postToVimeo,
UIActivity.ActivityType.postToTencentWeibo
]
present(vc,
animated: true,
completion: nil)
vc.popoverPresentationController?.sourceView = self.view
}
}
主要的事情是;
- 你需要一个“包装器”
UIViewController
才能做到这一点present
。
- 您需要
var uiImage:UIImage!
设置activityItems
.
接下来,将其包装成一个UIViewControllerRepresentable
:
struct SwiftUIActivityViewController : UIViewControllerRepresentable {
let activityViewController = ActivityViewController()
func makeUIViewController(context: Context) -> ActivityViewController {
activityViewController
}
func updateUIViewController(_ uiViewController: ActivityViewController, context: Context) {
//
}
func shareImage(uiImage: UIImage) {
activityViewController.uiImage = uiImage
activityViewController.shareImage()
}
}
唯一需要注意的两件事是:
- 实例化
ActivityViewController
以将其返回ContentView
- 创建
shareImage(uiImage:UIImage
) 来调用它。
最后,您有ContentView
:
struct ContentView : View {
let activityViewController = SwiftUIActivityViewController()
@State var uiImage = UIImage(named: "vermont.jpg")
var body: some View {
VStack {
Button(action: {
self.activityViewController.shareImage(uiImage: self.uiImage!)
}) {
ZStack {
Image(systemName:"square.and.arrow.up").renderingMode(.original).font(Font.title.weight(.regular))
activityViewController
}
}.frame(width: 60, height: 60).border(Color.black, width: 2, cornerRadius: 2)
Divider()
Image(uiImage: uiImage!)
}
}
}
请注意,有一些硬编码和(呃)强制展开uiImage
,以及不必要的@State
. 这些是因为我打算使用 `UIImagePickerController next 将它们联系在一起。
这里需要注意的事项:
- 实例化
SwiftUIActivityViewController
,并shareImage
用作 Button 操作。
- 用它也可以作为按钮显示。不要忘记,甚至 a
UIViewControllerRepresentable
也只是被认为是 SwiftUI View
!
将图像的名称更改为您项目中的名称,这应该可以工作。您将获得一个居中的 60x60 按钮,其下方有图片。