MessageKit开发:用户点击消息内图片时如何打开并展示图片
原因说明
你给UIImageView添加的自定义点击手势无法触发,是因为MessageKit内置的MessageCollectionViewCell已经对图片消息的图片控件添加了自带的点击手势识别器,优先级高于你自定义添加的手势,点击事件会被优先拦截触发didTapImage(in:)代理方法,不需要额外自行添加手势,直接使用该系统回调即可实现需求。
实现步骤
1. 确保持有消息数据源
你需要持有当前渲染聊天列表的消息数组,用于根据cell定位到对应的消息资源:
// 你的控制器/数据源层已有的消息列表属性 var messages: [MessageType] = []
2. 实现didTapImage回调逻辑
在回调中通过cell获取对应的indexPath,取出对应的图片资源后调起你的图片预览逻辑即可:
func didTapImage(in cell: MessageCollectionViewCell) { // 安全获取cell对应的indexPath与对应消息 guard let indexPath = messagesCollectionView.indexPath(for: cell), indexPath.row < messages.count, let message = messages[safe: indexPath.row] else { return } // 匹配图片消息类型,取出图片资源 if case .photo(let photoItem) = message.kind { // 可选方案1:直接取cell内已加载完成的图片(避免二次加载) if let imageView = cell.messageContentView.subviews.first(where: { $0 is UIImageView }) as? UIImageView, let loadedImage = imageView.image { // 调用你自定义的图片预览方法 presentImagePreview(image: loadedImage) } // 可选方案2:取图片URL用于预览加载(适配cell复用导致图片被清空的场景) else if let imageUrl = photoItem.url { presentImagePreview(url: imageUrl) } } }
可选优化:添加数组安全下标
避免数组越界崩溃,可以提前添加Collection的安全下标扩展:
extension Collection { subscript(safe index: Index) -> Element? { return indices.contains(index) ? self[index] : nil } }
注意事项
可以删掉configureMediaMessageImageView方法中给imageView添加点击手势的代码,该代码既不会生效,还会因为cell复用导致重复添加手势,产生不必要的性能损耗。
内容的提问来源于stack exchange,提问作者Am1rFT
相关产品推荐
相关产品推荐

