ios - 在 MessageKit 中点击时放大图像视图 - Swift
问题描述
我试图在MessageCollectionView
点击时放大单元格中的图像,这是大多数消息传递应用程序中的标准。我成功地能够识别用户对每个单元格的点击并确定它是照片还是文本单元格,但我的imageTapped
功能似乎没有触发。img
我在imageTapped
函数内部传递给函数的值didTapMessage
看起来像UIImageView
预期的那样。里面的控制台打印imageTapped
似乎没有触发,所以它永远不会进入那个函数。也许我在这里遗漏了一些简单的东西,但我觉得它应该通过那个功能!
我正在使用 Swift 5、iOS 13.2 和 MessageKit。
代码:
// MARK: - MessageCellDelegate
// With help from:
// - https://github.com/MessageKit/MessageKit/issues/778
// - https://stackoverflow.com/questions/45536405/full-screen-an-image-inside-a-tableviewcell-when-tapped-swift
// - https://github.com/MessageKit/MessageKit/issues/261
extension RoomVC: MessageCellDelegate {
func didTapMessage(in cell: MessageCollectionViewCell) {
guard let indexPath = messagesCollectionView.indexPath(for: cell) else { return }
guard let messagesDataSource = messagesCollectionView.messagesDataSource else { return }
let message = messagesDataSource.messageForItem(at: indexPath, in: messagesCollectionView)
switch message.kind {
case .photo(let photoItem):
log.info("Message is a photo.")
if let img = photoItem.image{
self.imageTapped(image: img)
}
default:
log.info("Message is not a photo.")
break
}
}
func imageTapped(image: UIImage){
log.info("Entered the imageTapped function.")
let newImageView = UIImageView(image: image)
newImageView.frame = UIScreen.main.bounds
newImageView.backgroundColor = .black
newImageView.contentMode = .scaleAspectFit
newImageView.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
newImageView.addGestureRecognizer(tap)
self.view.addSubview(newImageView)
self.navigationController?.isNavigationBarHidden = true
self.tabBarController?.tabBar.isHidden = true
}
@objc func dismissFullscreenImage(_ sender: UITapGestureRecognizer) {
self.navigationController?.isNavigationBarHidden = false
self.tabBarController?.tabBar.isHidden = false
sender.view?.removeFromSuperview()
}
}
解决方案
不知道为什么我对这个问题投了反对票,但我们找到的解决方案是,当我们抓取 downloadUrl 时,我们将图像作为 nil 传递给 url 而不是图像。
var kind: MessageKind {
if let url = downloadURL {
- return .photo(ImageMediaType(url: url, image: nil, placeholderImage: #imageLiteral(resourceName: "placeholder"), size: CGSize(width: 150, height: 150)))
+ return .photo(ImageMediaType(url: url, image: image, placeholderImage: #imageLiteral(resourceName: "placeholder"), size: CGSize(width: 150, height: 150)))
}
return .text(content)
}
推荐阅读
- javascript - 使用循环将具有相同键的数组中的javascript数组合并
- asp.net-core - expires_in 或 expires_at 用于 OpenId 连接中的访问令牌?
- python - matplotlib scatter 失败并出现错误:'c' 参数有 n 个元素,不能与大小为 n 的 'x' 和大小为 n 的 'y' 一起使用
- c - 从非常量 char* 数组中读取
- angular - webpack-angular : bundle 包含整个 node_modules 库
- angular - Reducer 的 @ngrx/entity EntityAdapter 函数不会更改存储状态
- matlab - 无法在条形图上应用颜色图
- angular - 使用 NgModel 对象引用更改输入值。角 5
- api - 在从空手道调用 API 之前检查底层存储过程的运行状况/可用性
- php - 在覆盖php内容期间包含什么文件?