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 共享图像的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 SwiftUI 创建系统映像

无法使用 SwiftUI 推断复杂的闭包返回类型

无法使用 SwiftUI 使选取器居中

无法使用 SwiftUI 实现暗模式 [重复]

使用 SwiftUI 时无法正确调整 SKScene 的大小

无法使用 SwiftUI 从 Firebase / Firestore 中删除文档