Swift 4中UIImage分享问题:生成二维码后报[ShareSheet]错误
我之前做二维码分享功能时也踩过这个坑,这个错误基本是因为你生成的二维码图片格式有问题——直接用UIImage(ciImage: output)创建的UIImage并没有真正的位图数据,它只是Core Image图像的一个引用,当分享Sheet尝试读取图片的实际数据时,就会因为数据缺失或者上下文问题导致连接失效。
问题根源
CIImage是Core Image框架中的对象,它本身不存储像素数据,只是描述图像的处理流程。用UIImage(ciImage:)初始化的UIImage并没有把CIImage的渲染结果转换成实际的位图,所以在分享这种UIImage时,系统无法正确获取到可分享的图片数据,从而抛出connection invalidate错误。
修复方案
我们需要修改二维码生成函数,把CIImage正确渲染成包含完整位图数据的UIImage:
func generateQRCode(string: String){ // 建议用utf8编码,支持更多字符(比如中文) guard let data = string.data(using: .utf8) else { print("无法将字符串转换为数据") return } if let filter = CIFilter(name: "CIQRCodeGenerator") { filter.setValue(data, forKey: "inputMessage") // 可以设置二维码纠错级别,可选:L/M/Q/H,默认是M filter.setValue("H", forKey: "inputCorrectionLevel") let transform = CGAffineTransform(scaleX: 3, y: 3) if let output = filter.outputImage?.transformed(by: transform) { // 用CIContext渲染CIImage为CGImage,再转成UIImage let context = CIContext(options: [.useSoftwareRenderer: false]) guard let cgImage = context.createCGImage(output, from: output.extent) else { print("无法渲染CIImage为CGImage") return } let qrImage = UIImage(cgImage: cgImage) imageQRCode.image = qrImage self.qrImage = qrImage self.tableView.reloadData() } } }
额外的分享流程优化
另外,为了兼容iPad的分享Sheet(避免崩溃),可以在present分享控制器时添加popover的配置:
let shareText = NSLocalizedString("SHARE_QR_TITLE", comment: "") if let image = qrImage { let vc = UIActivityViewController(activityItems: [shareText, image], applicationActivities: []) // iPad适配 if let popoverController = vc.popoverPresentationController { // 设置popover的锚点,比如用按钮或者当前视图 popoverController.sourceView = self.view popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0) popoverController.permittedArrowDirections = [] } present(vc, animated: true) }
这样修改后,生成的二维码图片是包含完整位图数据的UIImage,ShareSheet就能正常读取并处理分享请求了。
内容的提问来源于stack exchange,提问作者RFComp
相关产品推荐
相关产品推荐

