I removed the avatar from the chat, and I was able to move the message itself, but I could not move the date of the message. How to do it?
There is also another question: I have a message date written after every four messages. How to make time written only when the next day begins?
On the screen is an example of what happened.
class ChatsViewController: MessagesViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let layout = messagesCollectionView.collectionViewLayout as? MessagesCollectionViewFlowLayout {
layout.textMessageSizeCalculator.outgoingAvatarSize = .zero
layout.textMessageSizeCalculator.incomingAvatarSize = .zero
layout.photoMessageSizeCalculator.outgoingAvatarSize = .zero
layout.photoMessageSizeCalculator.incomingAvatarSize = .zero
layout.attributedTextMessageSizeCalculator.incomingAvatarSize = .zero
layout.attributedTextMessageSizeCalculator.outgoingAvatarSize = .zero
layout.attributedTextMessageSizeCalculator.avatarLeadingTrailingPadding = .zero
}
}
}
// MARK: - MessagesDataSource
extension ChatsViewController: MessagesDataSource {
func cellTopLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
if indexPath.item % 4 == 0 {
return NSAttributedString(
string: MessageKitDateFormatter.shared.string(from: message.sentDate),
attributes: [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 10),
NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1176470588, green: 0.4470588235, blue: 0.8, alpha: 1)])
} else {
return nil
}
}
func messageBottomLabelAttributedText(for message: MessageType, at indexPath: IndexPath) -> NSAttributedString? {
return NSAttributedString(string: MessageKitDateFormatter.shared.string(from: message.sentDate), attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption1)])
}
}
// MARK: - MessagesLayoutDelegate
extension ChatsViewController: MessagesLayoutDelegate {
func footerViewSize(for section: Int, in messagesCollectionView: MessagesCollectionView) -> CGSize {
return CGSize(width: 0, height: 8)
}
func cellTopLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
if (indexPath.item) % 4 == 0 {
return 30
} else {
return 0
}
}
func messageBottomLabelHeight(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGFloat {
return 16
}
}
// MARK: - MessagesDisplayDelegate
extension ChatsViewController: MessagesDisplayDelegate {
func configureAvatarView(_ avatarView: AvatarView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) {
avatarView.isHidden = true
}
func avatarSize(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> CGSize {
return .zero
}
func messageStyle(for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) -> MessageStyle {
return .bubble
}
}
You can use the setMessageIncomingMessageBottomLabelAlignment
and setMessageOutgoingMessageBottomLabelAlignment
methods on the flow layout to adjust the bottom label alignment like this:
messagesCollectionView.messagesCollectionViewFlowLayout.setMessageIncomingMessageBottomLabelAlignment(LabelAlignment(textAlignment: .left, textInsets: .zero))
messagesCollectionView.messagesCollectionViewFlowLayout.setMessageOutgoingMessageBottomLabelAlignment(LabelAlignment(textAlignment: .right, textInsets: .zero))
To answer your second question, you could keep around a variable in your class var lastDisplayedSentDate: Date?
and in your cellTopLabelAttributedText
method, check whether the lastDisplayedSentDate is in the same day as the current message, return nil
if they are in the same day, else return the date string and update the lastDisplayedSentDate
variable:
if let lastDisplayedSentDate = lastDisplayedSentDate, Calendar.current.isDate(lastDisplayedSentDate, inSameDayAs: message.sentDate) {
return nil
}
lastDisplayedSentDate = message.sentDate
return NSAttributedString(
string: MessageKitDateFormatter.shared.string(from: message.sentDate),
attributes: [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 10),
NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.1176470588, green: 0.4470588235, blue: 0.8, alpha: 1)])
and you can add similar logic to the cellTopLabelHeight
method.