4

我试图在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()
    }
}
4

3 回答 3

4

不知道为什么我对这个问题投了反对票,但我们找到的解决方案是,当我们抓取 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)
    }
于 2019-11-17T05:04:03.003 回答
0

解决方案是正确的,但我认为它缺少 func didTapImage 的实现。我能够通过在 didTapImage 而不是 didTapMessage 中实现相同的功能来使其工作。

更多细节可以在这里找到:https ://github.com/MessageKit/MessageKit/blob/master/Example/Sources/View%20Controllers/ChatViewController.swift

第 195 行

于 2021-03-20T01:12:09.793 回答
0

由于图像已经加载到单元格中,我认为您可以通过直接从单元格中获取图像对象来节省资源,而无需查找 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
于 2022-02-21T05:12:22.310 回答