iOS13 Share Sheet:分享UIImage时如何设置预览缩略图?
这个问题我之前也碰到过,iOS13及以上版本的Share Sheet对预览内容的判定逻辑有变化,直接传递UIImage实例时,系统无法正确生成图片预览,就会 fallback显示应用图标。下面给你两种可行的解决方案:
方法一:用NSItemProvider包装图片数据
这种方法比较简洁,核心是把图片数据用NSItemProvider包装,明确告诉系统这是图片类型的内容,让它能正确生成预览:
首先需要导入MobileCoreServices框架(因为用到了图片类型的常量),然后修改你的代码:
import UIKit import MobileCoreServices // ... 你的视图控制器代码 ... let image = UIImage(named: "test")! // 将UIImage转为PNG数据(也可以用JPEG,根据需求调整) guard let imageData = image.pngData() else { print("无法转换图片为数据") return } // 创建NSItemProvider,指定类型为PNG图片 let itemProvider = NSItemProvider(item: imageData as NSSecureCoding?, typeIdentifier: kUTTypePNG as String) // 初始化ActivityVC let activityVC = UIActivityViewController(activityItems: [itemProvider], applicationActivities: nil) activityVC.popoverPresentationController?.sourceView = self.view self.present(activityVC, animated: true, completion: nil)
方法二:自定义UIActivityItemSource实现更灵活的预览
如果需要自定义预览的标题、描述等额外信息,可以通过实现UIActivityItemSource协议来控制分享内容和预览:
先创建一个遵守协议的类:
import UIKit import MobileCoreServices class ImageActivityItemSource: NSObject, UIActivityItemSource { private let targetImage: UIImage init(image: UIImage) { self.targetImage = image super.init() } // 提供实际分享的内容(这里返回图片数据) func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? { return targetImage.pngData() } // 配置预览的元数据,包括预览图和标题 func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? { let metadata = LPLinkMetadata() metadata.title = "我的分享图片" // 自定义预览标题 // 设置预览图片的提供者 metadata.imageProvider = NSItemProvider(object: targetImage) return metadata } // 返回占位内容,系统会用这个来提前准备预览 func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { return targetImage } }
然后在你的视图控制器里使用这个类:
let image = UIImage(named: "test")! let itemSource = ImageActivityItemSource(image: image) let activityVC = UIActivityViewController(activityItems: [itemSource], applicationActivities: nil) activityVC.popoverPresentationController?.sourceView = self.view self.present(activityVC, animated: true, completion: nil)
这两种方法都能让Share Sheet的左上角正确显示你要分享的图片缩略图,和内置Mail应用的效果一致。如果只是需要简单的预览,方法一足够;如果需要自定义预览的更多细节,方法二更合适。
内容的提问来源于stack exchange,提问作者mmklug
相关产品推荐
相关产品推荐

