将UITapGestureRecognizer添加到JSQMessageViewController头像

时间:2018-01-25 01:47:36

标签: swift uitapgesturerecognizer jsqmessagesviewcontroller

我正在尝试将手势识别器添加到我正在聊天的用户的头像图像中。我把它放在cellForItemAt函数中,但是它不起作用。我不知道在化身上添加手势识别器的位置或方式。我想让头像能够被触摸,然后将用户发送到他/她正在聊天的用户的个人资料页面。

 let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))

        cell.avatarImageView.addGestureRecognizer(tap)


        cell.avatarImageView.isUserInteractionEnabled = true




let incomingBubble = JSQMessagesBubbleImageFactory(bubble: UIImage.jsq_bubbleCompactTailless(), capInsets: UIEdgeInsets.zero).incomingMessagesBubbleImage(with: UIColor(white: 0.90, alpha: 1.0))
let incomingBubbleWithTail = JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage(with: UIColor(white: 0.90, alpha: 1.0))
let outgoingBubble = JSQMessagesBubbleImageFactory(bubble: UIImage.jsq_bubbleCompactTailless(), capInsets: UIEdgeInsets.zero).outgoingMessagesBubbleImage(with: UIColor.red)
let outgoingBubbleWithTail = JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage(with: UIColor.red)

var messages:[JSQMessage]!

var conversation:Conversation!
var conversationKey:String!
var partner:Users!
var partnerImage:UIImage?

var downloadRef:DatabaseReference?

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .plain, target: self, action: #selector(handleDismiss))
    view.backgroundColor = UIColor(white: 1.0, alpha: 1.0)

    self.senderDisplayName = ""
    if let user = Auth.auth().currentUser {
        self.senderId = user.uid
    } else {
        self.senderId = ""
    }

    messages = [JSQMessage]()

    self.inputToolbar.contentView.rightBarButtonItem.setTitleColor(UIColor.red, for: .normal)
    self.inputToolbar.contentView.leftBarButtonItemWidth = 0
    self.inputToolbar.contentView.textView.placeHolder = "New message"
    self.inputToolbar.contentView.textView.keyboardAppearance = .light

    collectionView?.collectionViewLayout.springinessEnabled = true
    collectionView?.backgroundColor = UIColor(white: 1.0, alpha: 1.0)
    collectionView?.reloadData()

      title = partner.firstLastName
    conversation.printAll()
    downloadRef = Database.database().reference().child("conversations/threads/\(conversation.key)")
    downloadMessages()





}

@objc func handleDismiss() {
    self.dismiss(animated: true, completion: nil)
}


override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    conversation.printAll()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    downloadRef?.removeAllObservers()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.messages.count
}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! {
    let data = self.messages[indexPath.row]
    return data
}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! {
    let data = messages[indexPath.row]
    switch(data.senderId) {
    case self.senderId:
        return self.outgoingBubble
    default:
        return self.incomingBubble
    }
}


override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! {
    let data = messages[indexPath.row]
    switch(data.senderId) {
    case self.senderId:
        return nil
    default:
        if partnerImage != nil {
            let image = JSQMessagesAvatarImageFactory.avatarImage(with: partnerImage!, diameter: 48)
            return image
        }

        return nil
    }
}

// function which is triggered when handleTap is called
@objc func handleTap(_ sender: UITapGestureRecognizer) {
    print("Hello World")
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as! JSQMessagesCollectionViewCell

    let data = messages[indexPath.row]
    switch(data.senderId) {
    case self.senderId:


        cell.textView?.textColor = UIColor.white
    default:
        cell.textView?.textColor = UIColor.black
    }
    return cell
}


override func collectionView

    (_ collectionView: JSQMessagesCollectionView!, attributedTextForCellTopLabelAt indexPath: IndexPath!) -> NSAttributedString! {
    let currentItem = self.messages[indexPath.item]

    if indexPath.item == 0 && messages.count > 8 {
        return JSQMessagesTimestampFormatter.shared().attributedTimestamp(for: currentItem.date)
    }


    if indexPath.item > 0 {
        let prevItem    = self.messages[indexPath.item-1]

        let gap = currentItem.date.timeIntervalSince(prevItem.date)

        if gap > 1800 {
            return JSQMessagesTimestampFormatter.shared().attributedTimestamp(for: currentItem.date)
        }
    } else {
        return JSQMessagesTimestampFormatter.shared().attributedTimestamp(for: currentItem.date)
    }


    return nil
}


override func collectionView(_ collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForCellTopLabelAt indexPath: IndexPath!) -> CGFloat {

    if indexPath.item == 0 && messages.count > 8 {
        return kJSQMessagesCollectionViewCellLabelHeightDefault
    }

    if indexPath.item > 0 {
        let currentItem = self.messages[indexPath.item]
        let prevItem    = self.messages[indexPath.item-1]

        let gap = currentItem.date.timeIntervalSince(prevItem.date)

        if gap > 1800 {
            return kJSQMessagesCollectionViewCellLabelHeightDefault
        }

        if prevItem.senderId != currentItem.senderId {
            return 1.0
        } else {
            return 0.0
        }
    }  else {
        return kJSQMessagesCollectionViewCellLabelHeightDefault
    }


}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForCellBottomLabelAt indexPath: IndexPath!) -> CGFloat {
    return 0.0
}

1 个答案:

答案 0 :(得分:1)

有didTapAvatarImageView的内置函数,你只需在你的类中覆盖它

override func collectionView(_ collectionView: JSQMessagesCollectionView!, didTapAvatarImageView avatarImageView: UIImageView!, at indexPath: IndexPath!) {
    //your actions
}