jessesquires / JSQMessagesViewController

An elegant messages UI library for iOS
https://www.jessesquires.com/blog/officially-deprecating-jsqmessagesviewcontroller/
Other
11.14k stars 2.82k forks source link

Display the same position of outgoingMessagesBubbleImage and incomingMessagesBubbleImage #2206

Closed KheangSenghort closed 5 years ago

KheangSenghort commented 5 years ago

When server provide api not base on Sender & Receiver: I try to use field fromUser to customize outgoingMessage & incomingMessage but it not work. Everyone can help me to correct code.

import UIKit import JSQMessagesViewController

class Message: JSQMessage { var fromUser: String?

init!(senderId: String!, senderDisplayName: String!, date: Date!, text: String!, fromUser: String!) {
    self.fromUser = fromUser
    super.init(senderId: senderId, senderDisplayName: senderDisplayName, date: date, text: text)
}
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

class ChatViewController: JSQMessagesViewController {

lazy var outgoingBubble: JSQMessagesBubbleImage = {
    return JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage(with: UIColor.jsq_messageBubbleBlue())
}()

lazy var incomingBubble: JSQMessagesBubbleImage = {
    return JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleLightGray())
}()

var messages = [Message]()
var userName = ""
var fromUser = ""
var user = ""

override func viewDidLoad() {
    super.viewDidLoad()
    self.fromUser = "1"
    for i in 1...115{
        user =  (i%2 == 0) ? "2" : self.fromUser
        let message = Message(senderId: "Enior", senderDisplayName: "John Alex", date: Date(), text: "Hello!  I am here to help you", fromUser: user)
        self.messages.append(message!)
    }
    inputToolbar.contentView.leftBarButtonItem = nil
    collectionView.collectionViewLayout.incomingAvatarViewSize = .zero
    collectionView.collectionViewLayout.outgoingAvatarViewSize = .zero
    collectionView?.collectionViewLayout.springinessEnabled = false
    automaticallyScrollsToMostRecentMessage = true
    self.collectionView?.reloadData()
    self.collectionView?.layoutIfNeeded()
}

// Override method
override var senderDisplayName:String! {
    get{
        return self.userName
    }
    set{
        //do nothing
    }
}

override var senderId:String! {
    get{
        return self.fromUser
    }
    set{
        //do nothing
    }
}

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

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! {
    return messages[indexPath.item]
}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! {
    return messages[indexPath.item].fromUser == senderId ? outgoingBubble: incomingBubble
}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! {
    return nil
}

override func collectionView(_ collectionView: JSQMessagesCollectionView, attributedTextForCellTopLabelAt indexPath: IndexPath) -> NSAttributedString? {
    if (indexPath.item % 3 == 0) {
        let message = self.messages[indexPath.item]
        return JSQMessagesTimestampFormatter.shared().attributedTimestamp(for: message.date)
    }
    return nil
}

override func collectionView(_ collectionView: JSQMessagesCollectionView, attributedTextForMessageBubbleTopLabelAt indexPath: IndexPath) -> NSAttributedString? {
    let message = messages[indexPath.item]
    if message.fromUser == self.senderId {
        return nil
    }
    return NSAttributedString(string: message.senderDisplayName)
}

override func collectionView(_ collectionView: JSQMessagesCollectionView, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout, heightForCellTopLabelAt indexPath: IndexPath) -> CGFloat {
    if indexPath.item % 7 == 0 {
        return kJSQMessagesCollectionViewCellLabelHeightDefault
    }
    return 0.0
}

override func collectionView(_ collectionView: JSQMessagesCollectionView, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout, heightForMessageBubbleTopLabelAt indexPath: IndexPath) -> CGFloat {
    let currentMessage = self.messages[indexPath.item]
    if currentMessage.fromUser == self.senderId {
        return 0.0
    }
    if indexPath.item - 1 > 0 {
        let previousMessage = self.messages[indexPath.item - 1]
        if previousMessage.fromUser == currentMessage.fromUser {
            return 0.0
        }
    }
    return kJSQMessagesCollectionViewCellLabelHeightDefault;
}

}