Ponieważ każdy obiekt JSQMessage
ma właściwość date
, można po prostu porównać datę każdej wiadomości do dnia poprzedniego komunikatu.
[thisMessageDate timeIntervalSinceDate:(NSDate *)previousMessageDate]
daje różnicę w sekundach. Jeśli różnica jest większa niż, powiedzmy, minuta (lub jakikolwiek przedział czasowy, który chcesz), a następnie wyświetlić znacznik czasu.
To jak ja to robię:
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath {
JSQMessage *message = [self.messages objectAtIndex:indexPath.item];
if (indexPath.item == 0) {
return [[JSQMessagesTimestampFormatter sharedFormatter] attributedTimestampForDate:message.date];
}
if (indexPath.item - 1 > 0) {
JSQMessage *previousMessage = [self.messages objectAtIndex:indexPath.item - 1];
if ([message.date timeIntervalSinceDate:previousMessage.date]/60 > 1) {
return [[JSQMessagesTimestampFormatter sharedFormatter] attributedTimestampForDate:message.date];
}
}
return nil;
}
A potem po prostu powtórzyć tę logikę, aby upewnić się datowniki ma poprawnych wysokościach
- (CGFloat)collectionView:(JSQMessagesCollectionView *)collectionView
layout:(JSQMessagesCollectionViewFlowLayout *)collectionViewLayout heightForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.item == 0) {
return kJSQMessagesCollectionViewCellLabelHeightDefault;
}
if (indexPath.item - 1 > 0) {
JSQMessage *previousMessage = [self.messages objectAtIndex:indexPath.item - 1];
JSQMessage *message = [self.messages objectAtIndex:indexPath.item];
if ([message.date timeIntervalSinceDate:previousMessage.date]/60 > 1) {
return kJSQMessagesCollectionViewCellLabelHeightDefault;
}
}
return 0.0f;
}
miłą odpowiedź. Jedyną rzeczą, która powinna być "if (indexPath.item> 0)" zamiast "if (indexPath.item - 1> 0)" w obu callbackach. Tracisz logikę drugiego elementu w stosunku do pierwszego. – yzucker