在 MessageKit 中点击时放大图像视图 - Swift
Enlarging image view when tapped in MessageKit - Swift
我正在尝试在点击单元格中的 MessageCollectionView
中放大图像,这在大多数消息传递应用程序中都是标准操作。我成功地能够识别用户点击每个单元格并确定它是照片还是文本单元格,但我的 imageTapped
功能似乎没有触发。我传递给 didTapMessage
函数内的 imageTapped
函数的 img
值看起来像是预期的 UIImageView
。 imageTapped
中的控制台打印似乎没有触发,因此它永远不会进入该功能。也许我在这里遗漏了一些简单的东西,但我觉得它应该通过那个函数来实现!
我正在使用 Swift 5、iOS 13.2 和 MessageKit。
代码:
// MARK: - MessageCellDelegate
// With help from:
// - https://github.com/MessageKit/MessageKit/issues/778
// -
// - 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)
}
解决方案是正确的,但我认为它缺少 func didTapImage 的实现。我能够通过在 didTapImage 而不是 didTapMessage 中实现相同的功能来让它工作。
可以在此处找到更多详细信息:https://github.com/MessageKit/MessageKit/blob/master/Example/Sources/View%20Controllers/ChatViewController.swift
第 195 行
由于图像已经加载到单元格中,我认为您可以通过直接从单元格中获取图像对象来节省资源,而无需查找 indexPath、数据源、消息种类等...
func didTapImage(in cell: MessageCollectionViewCell) {
if let image = (cell as? MediaMessageCell)?.imageView.image {
// create and show the new ImageView with this image.
}
}
您可能还需要隐藏 inputBar(就像隐藏 tabBar 一样):
self.messageInputBar.isHidden = true
然后在您的 dismissFullScreenImage 中再次显示它
self.messageInputBar.isHidden = false
我正在尝试在点击单元格中的 MessageCollectionView
中放大图像,这在大多数消息传递应用程序中都是标准操作。我成功地能够识别用户点击每个单元格并确定它是照片还是文本单元格,但我的 imageTapped
功能似乎没有触发。我传递给 didTapMessage
函数内的 imageTapped
函数的 img
值看起来像是预期的 UIImageView
。 imageTapped
中的控制台打印似乎没有触发,因此它永远不会进入该功能。也许我在这里遗漏了一些简单的东西,但我觉得它应该通过那个函数来实现!
我正在使用 Swift 5、iOS 13.2 和 MessageKit。
代码:
// MARK: - MessageCellDelegate
// With help from:
// - https://github.com/MessageKit/MessageKit/issues/778
// -
// - 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)
}
解决方案是正确的,但我认为它缺少 func didTapImage 的实现。我能够通过在 didTapImage 而不是 didTapMessage 中实现相同的功能来让它工作。
可以在此处找到更多详细信息:https://github.com/MessageKit/MessageKit/blob/master/Example/Sources/View%20Controllers/ChatViewController.swift
第 195 行
由于图像已经加载到单元格中,我认为您可以通过直接从单元格中获取图像对象来节省资源,而无需查找 indexPath、数据源、消息种类等...
func didTapImage(in cell: MessageCollectionViewCell) {
if let image = (cell as? MediaMessageCell)?.imageView.image {
// create and show the new ImageView with this image.
}
}
您可能还需要隐藏 inputBar(就像隐藏 tabBar 一样):
self.messageInputBar.isHidden = true
然后在您的 dismissFullScreenImage 中再次显示它
self.messageInputBar.isHidden = false