添加手势识别器后未修改UICollectionViewCell背景色

问题描述

长话短说-尝试实现 whatsapp 样式的邮件回复功能。

  • 长按(按住)聊天气泡上的用户
  • 聊天气泡和单元格背景颜色发生变化,表明已选择
  • 呈现一个操作栏,询问用户是否要回复消息
  • 如果用户按下回复,则将单元格背景色和聊天气泡颜色恢复为默认值

我通过添加到整个收藏夹视图中的UILongTapGesture实现了这一目标

问题: 手势识别 点击 索引 路径。当我使用print(indexPath.item)时,也会打印准确的索引路径。问题是我无法修改使用此索引路径访问的单元格的属性。我相信我正在以正确的方式访问该单元。我想在用户点击某个单元格但没有任何反应后更改该单元格的背景颜色和聊天气泡

代码如下:

@objc func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer){
        let generator = UINotificationFeedbackGenerator()
        generator.prepare()

        if gestureRecognizer.state == .began {
            generator.notificationOccurred(.success)
            
            let touchPoint = gestureRecognizer.location(in: self.collectionView)
            if let indexPath = collectionView.indexPathForItem(at: touchPoint) {
                let cell = collectionView(self.collectionView,cellForItemAt: indexPath) as? ChatCell
                //DOES NOT WORK
                cell?.backgroundColor = UIColor.black
                
                let alertController = UIAlertController(title: "Actions",message: "Press reply to reply to selected messages",preferredStyle: .actionSheet)
                
                let replyAction = UIAlertAction(title: "Reply",style: .default) { (_) in
                    //do stuff here
                    alertController.dismiss(animated: true,completion: nil)
                }
                
                let cancelAction = UIAlertAction(title: "Cancel",style: .cancel) { (_) in
                    cell?.backgroundColor = .clear
                    alertController.dismiss(animated: true,completion: nil)
                }
                
                alertController.addAction(replyAction)
                alertController.addAction(cancelAction)
                self.present(alertController,animated: true)
            }
        }
    }

这就是我添加手势识别器的方式:

        let longPressGesture: UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self,action: #selector(self.handleLongPress))
        longPressGesture.minimumPressDuration = 1.0 // 1 second press
        longPressGesture.delegate = self
        self.collectionView.addGestureRecognizer(longPressGesture)

这是我的收藏集查看单元格:

override init(frame: CGRect) {
        super.init(frame: frame)
        
        addSubview(bubbleView)
        bubbleView.layer.cornerRadius = 12
        bubbleView.anchor(top: topAnchor,leading: nil,bottom: bottomAnchor,trailing: nil,padding: .init(top: 16,left: 0,bottom: 16,right: 0))
        bubbleView.widthAnchor.constraint(lessThanOrEqualToConstant: 250).isActive = true
        bubbleConstraintLeading = bubbleView.leadingAnchor.constraint(equalTo: leadingAnchor,constant: 16)
        bubbleConstraintTrailing = bubbleView.trailingAnchor.constraint(equalTo: trailingAnchor,constant: -16)
        
        bubbleView.addSubview(messageLabel)
        messageLabel.numberOfLines = 0
        messageLabel.anchor(top: bubbleView.topAnchor,leading: bubbleView.leadingAnchor,bottom: bubbleView.bottomAnchor,trailing: bubbleView.trailingAnchor,padding: .init(top: 4,left: 16,bottom: 4,right: 16))
        
        addSubview(timestampLabel)
        timestampLabel.anchor(top: bubbleView.bottomAnchor,right: 0))
        timestampConstraintLeading = timestampLabel.leadingAnchor.constraint(equalTo: leadingAnchor,constant: 24)
        timestampConstraintTrailing = timestampLabel.trailingAnchor.constraint(equalTo: trailingAnchor,constant: -24)
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)