Cambiar una lógica de timestamp en JSQMessagesViewController

Es posible la lógica de cambio de collectionView: attributedTextForCellTopLabelAtIndexPath: delegate method for show date timestamp no por indexPath.item% 4 == 0? ¿Cómo te gusta en SOMessaging día a día? ¿o lo que sea?

esta encoding es para mostrar timestamp.

- (CGFloat)collectionView:(JSQMessagesCollectionView *)collectionView layout:(JSQMessagesCollectionViewFlowLayout *)collectionViewLayout heightForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.item % 3 == 0) { return kJSQMessagesCollectionViewCellLabelHeightDefault; } return 0.0f; } 

La lógica actual actual está mostrando la misma timestamp que se reproduce de la siguiente manera.

introduzca la descripción de la imagen aquí

Como cada object JSQMessage tiene una propiedad de date , simplemente puede comparar la date de cada post con la date del post anterior.

[thisMessageDate timeIntervalSinceDate:(NSDate *)previousMessageDate] te dará la diferencia en segundos. Si la diferencia es mayor que, digamos, un minuto (o el intervalo de time que desee), luego muestre una timestamp.

Así es como lo estoy haciendo:

 - (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath { JSQMessage *message = [self.messages objectAtIndex:indexPath.item]; if (indexPath.item == 0) { return [[JSQMessagesTimestampFormatter shanetworkingFormatter] 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 shanetworkingFormatter] attributedTimestampForDate:message.date]; } } return nil; } 

Y luego simplemente repita esta lógica para asegurarse de que las marcas de time tengan las alturas correctas:

 - (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; } 

Para mostrar la celda de day by day hora solo day by day ;

Con la respuesta de @cerenali , es posible que tengamos problemas para las dates que tienen días diferentes pero times cercanos. Me gusta:

 msgDate1 = 31/03/2016 23:55 msgDate2 = 01/04/2016 00:07 

Para manejar esto, reemplacé la lógica dentro if con:

 BOOL checkTime = message.date.year != previousMessage.date.year || message.date.month != previousMessage.date.month || message.date.day != previousMessage.date.day; 

y el código final será:

  JSQMessage *message = [self.messages objectAtIndex:indexPath.item]; if (indexPath.item == 0) { return [[JSQMessagesTimestampFormatter shanetworkingFormatter] attributedTimestampForDate:message.date]; } if (indexPath.item - 1 > -1) { JSQMessage *previousMessage = [self.messages objectAtIndex:indexPath.item - 1]; BOOL checkTime = message.date.year != previousMessage.date.year || message.date.month != previousMessage.date.month || message.date.day != previousMessage.date.day; if (checkTime) { return [[JSQMessagesTimestampFormatter shanetworkingFormatter] attributedTimestampForDate:message.date]; } } 

Nota: Estoy usando DateTools en mi proyecto.

Gracias, @cerenali por la buena respuesta.

En Swift-3 , el código @cerenali puede escribirse en:

  override func collectionView(_ collectionView: JSQMessagesCollectionView, attributedTextForCellTopLabelAt indexPath: IndexPath) -> NSAttributedString? { let message = self.messages[indexPath.item] if indexPath.item == 0 { return JSQMessagesTimestampFormatter.shanetworking().attributedTimestamp(for: message.date) } if indexPath.item - 1 > 0{ let previousMessage = self.messages[indexPath.item - 1 ] if ( ( message.date.timeIntervalSince(previousMessage.date) / 60 ) > 1){ return JSQMessagesTimestampFormatter.shanetworking().attributedTimestamp(for: message.date) } } return nil } override func collectionView(_ collectionView: JSQMessagesCollectionView, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout, heightForCellTopLabelAt indexPath: IndexPath) -> CGFloat { if indexPath.item == 0 { return kJSQMessagesCollectionViewCellLabelHeightDefault } if indexPath.item - 1 > 0{ let message = self.messages[indexPath.item] let previousMessage = self.messages[indexPath.item - 1 ] if ( ( message.date.timeIntervalSince(previousMessage.date) / 60 ) > 1){ return kJSQMessagesCollectionViewCellLabelHeightDefault } } return 0.0 }