SwiftUI:无法使用 UIActivityViewController 共享图像
Posted
技术标签:
【中文标题】SwiftUI:无法使用 UIActivityViewController 共享图像【英文标题】:SwiftUI: Can't use UIActivityViewController to share an image 【发布时间】:2020-01-29 21:17:06 【问题描述】:我让 UIViewControllerRepresentable 像这样将 UIActivityViewController 变形为 SwiftUI:
struct ShareSheet: UIViewControllerRepresentable
typealias Callback = (_ activityType: UIActivity.ActivityType?, _ completed: Bool, _ returnedItems: [Any]?, _ error: Error?) -> Void
let activityItems: [Any]
let applicationActivities: [UIActivity]? = nil
let excludedActivityTypes: [UIActivity.ActivityType]? = nil
let callback: Callback? = nil
func makeUIViewController(context: Context) -> UIActivityViewController
let controller = UIActivityViewController(
activityItems: activityItems,
applicationActivities: applicationActivities)
controller.excludedActivityTypes = excludedActivityTypes
controller.completionWithItemsHandler = callback
return controller
func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context)
// nothing to do here
问题是:当我传递 UIImage 对象时,它的工作原理是这样的:
ShareSheet(activityItems: [UIImage(named: "doc")!])
但如果我传递 Image 对象,它就不起作用,像这样:
ShareSheet(activityItems: [Image("doc")])
在我的应用程序中,我只有 Image 对象中的图像而不是 UIImage,所以,我可以将 Image 变形为 UIImage 还是我必须做其他事情?
【问题讨论】:
看起来 Image 永远不会用于创建 UIImage。我找到了这个explanation,但是这里的答案从 UIImage 创建了一个图像。 我在文档中找不到它(还),但 UIKit 没有设置为处理 SwiftUI 项目,因此需要通过UIViewControllerRepresentable.
桥接 UIKit 项目。就像上面链接中指出的@jnblanchard 一样,您最简单的答案看起来像您需要将这些图像转换为 UIImages 以传递它们。 Image 的文档还表明它是一个后期绑定令牌,它依赖于它的环境来解析。如果你给它一个 UIKit 环境,我怀疑它没有这样做的上下文。 developer.apple.com/documentation/swiftui/image
阅读Parameters section
我想如果我可以将 Image 变形为 UIImage 问题就会解决!但是怎么办?
【参考方案1】:
原因是 Image("doc") 是 UIKit 无法处理的 View 类型。相反,UIImage(named: "doc") 是 UIImage 类型,这就是它起作用的原因。
【讨论】:
以上是关于SwiftUI:无法使用 UIActivityViewController 共享图像的主要内容,如果未能解决你的问题,请参考以下文章