如何在UIActivityController的圈选区域添加独立于分享内容的图片
UIActivityViewController 预览区添加自定义展示图片(不加入分享内容)实现方案
两种旧方案失效原因
- 第一种修改
ac.tabBarItem.image:tabBarItem是控制器在UITabBar中展示的项,和分享弹窗顶部的预览区域完全无关,所以不会生效。 - 第二种把图片放入
activityItems数组:系统会把数组内的所有元素都识别为待分享内容,所有支持接收图片的分享渠道都会获取到这张图,不符合你仅展示不分享的需求。
正确实现方案(兼容iOS13+,当前主流系统版本均支持)
通过遵守UIActivityItemSource协议自定义分享内容提供器,配合LinkPresentation框架的LPLinkMetadata注入预览资源,预览图仅用于展示,不会被带入实际分享内容。
实现步骤
- 导入依赖框架
import LinkPresentation
- 自定义分享内容提供器类
class ShareItemProvider: NSObject, UIActivityItemSource { /// 实际需要分享的内容,可传文案、链接等 private let shareContent: Any /// 仅用于预览展示的图片 private let previewImage: UIImage /// 预览区域展示的标题 private let previewTitle: String init(shareContent: Any, previewImage: UIImage, previewTitle: String) { self.shareContent = shareContent self.previewImage = previewImage self.previewTitle = previewTitle super.init() } /// 返回实际分享内容的占位类型 func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { shareContent } /// 返回给到分享渠道的实际内容,不含预览图 func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? { shareContent } /// 返回分享弹窗预览区域的元数据,此处配置的内容仅做展示,不会参与分享 func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? { let metadata = LPLinkMetadata() metadata.title = previewTitle // 设置预览区域的展示图片 metadata.imageProvider = NSItemProvider(object: previewImage) // 可选:设置小图标也为你的logo metadata.iconProvider = NSItemProvider(object: previewImage) return metadata } }
- 初始化并弹出UIActivityViewController
// 准备实际分享内容:文案+链接,不包含预览图 let shareText = "你觉得我做的uSTADIUM App怎么样?快来注册和我一起互动吧!" guard let shareUrl = URL(string: "你的分享链接地址"), let previewImage = UIImage(named: "uLogo") else { return } // 初始化自定义提供器 let shareProvider = ShareItemProvider( shareContent: [shareText, shareUrl], previewImage: previewImage, previewTitle: "uSTADIUM App分享" ) // 初始化分享控制器,仅传入自定义提供器即可 let activityVC = UIActivityViewController(activityItems: [shareProvider], applicationActivities: []) // 正常弹出控制器 present(activityVC, animated: true)
补充说明
如果需要兼容iOS13以下版本,可以通过遍历UIActivityViewController的视图层级找到对应预览区域的控件直接插入图片,但该方法依赖系统内部视图结构,不同系统版本可能有变动,兼容性差,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者tHatpart
相关产品推荐
相关产品推荐

