Un élégant contrôleur de vue de chat prêt à emporter pour les applications de chat iOS qui utilisent Quickblox communication backend .
#Caractéristiques
Quickblox .
pod 'QMChatViewController'
Faites glisser le dossier QMChatViewController dans votre dossier de projet et liez la cible appropriée.
Installez les dépendances.
Un exemple est inclus dans le référentiel. Essayez-le pour voir comment fonctionne le contrôleur de vue de chat.
Étapes pour ajouter QMChatViewController à votre application:
Créez une sous-classe de QMChatViewController . Vous pouvez le créer à la fois à partir du code et du constructeur d'interface.
Ouvrez votre sous-classe de QMChatViewController et effectuez ce qui suit dans la méthode ViewDidload :
self.senderID = 2000 ;
self.senderDisplayName = @" user1 " ;[ self .chatDataSource addMessages: <array of messages>];Gérer l'envoi du message.
- ( void )didPressSendButton:(UIButton *)button
withMessageText:( NSString *)text
senderId:( NSUInteger )senderId
senderDisplayName:( NSString *)senderDisplayName
date:( NSDate *)date {
// Add sending message - for example:
QBChatMessage *message = [QBChatMessage message ];
message. text = text;
message. senderID = senderId;
QBChatAttachment *attacment = [[QBChatAttachment alloc ] init ];
message. attachments = @[attacment];
[ self .chatDataSource addMessage: message];
[ self finishSendingMessageAnimated: YES ];
// Save message to your cache/memory storage.
// Send message using Quickblox SDK
}Retour des classes de vue de la cellule spécifique au message de chat:
- ( Class )viewClassForItem:(QBChatMessage *)item {
// Cell class for message
if (item. senderID != self. senderID ) {
return [QMChatIncomingCell class ];
}
else {
return [QMChatOutgoingCell class ];
}
return nil ;
}
Calculez la taille de la cellule et la largeur minimale:
- ( CGFloat )collectionView:(QMChatCollectionView *)collectionView minWidthAtIndexPath:( NSIndexPath *)indexPath {
QBChatMessage *item = [ self .chatDataSource messageForIndexPath: indexPath];
NSAttributedString *attributedString = item. senderID == self. senderID ?
[ self bottomLabelAttributedStringForItem: item] : [ self topLabelAttributedStringForItem: item];
CGSize size = [TTTAttributedLabel sizeThatFitsAttributedString: attributedString
withConstraints: CGSizeMake ( 1000 , 10000 )
limitedToNumberOfLines: 1 ];
return size. width ;
}Étiquettes supérieures, inférieures et texte.
- ( NSAttributedString *)attributedStringForItem:(QBChatMessage *)messageItem {
UIColor *textColor = [messageItem senderID ] == self. senderID ?
[UIColor whiteColor ] : [UIColor colorWithWhite: 0.290 alpha: 1.000 ];
UIFont *font = [UIFont fontWithName: @" Helvetica " size: 15 ];
NSDictionary *attributes = @{ NSForegroundColorAttributeName :textColor,
NSFontAttributeName :font};
NSMutableAttributedString *attrStr =
[[ NSMutableAttributedString alloc ] initWithString: messageItem.text
attributes: attributes];
return attrStr;
}
- ( NSAttributedString *)topLabelAttributedStringForItem:(QBChatMessage *)messageItem {
if (messageItem. senderID == self. senderID ) {
return nil ;
}
UIFont *font = [UIFont fontWithName: @" Helvetica " size: 14 ];
UIColor *textColor = [UIColor colorWithRed: 0.184 green: 0.467 blue: 0.733 alpha: 1.000 ];
NSDictionary *attributes = @{ NSForegroundColorAttributeName :textColor,
NSFontAttributeName :font};
NSMutableAttributedString *attrStr =
[[ NSMutableAttributedString alloc ] initWithString: @" nickname "
attributes: attributes];
return attrStr;
}
- ( NSAttributedString *)bottomLabelAttributedStringForItem:(QBChatMessage *)messageItem {
UIFont *font = [UIFont fontWithName: @" Helvetica " size: 12 ];
UIColor *textColor = [messageItem senderID ] == self. senderID ?
[UIColor colorWithWhite: 1.000 alpha: 0.510 ] : [UIColor colorWithWhite: 0.000 alpha: 0.490 ];
NSDictionary *attributes = @{ NSForegroundColorAttributeName :textColor,
NSFontAttributeName :font};
NSString *dateStr = @" 10:20 " ;
NSMutableAttributedString *attrStr =
[[ NSMutableAttributedString alloc ] initWithString: dateStr
attributes: attributes];
return attrStr;
}Modification des attributs de cellules de chat de collection sans modifier les contraintes:
struct QMChatLayoutModel {
CGSize avatarSize;
CGSize containerSize;
UIEdgeInsets containerInsets;
CGFloat topLabelHeight;
CGFloat bottomLabelHeight;
CGSize staticContainerSize;
CGFloat maxWidthMarginSpace;
};
typedef struct QMChatLayoutModel QMChatCellLayoutModel;Vous pouvez modifier ces attributs dans cette méthode:
- (QMChatCellLayoutModel)collectionView:(QMChatCollectionView *)collectionView layoutModelAtIndexPath:( NSIndexPath *)indexPath {
QMChatCellLayoutModel layoutModel = [ super collectionView: collectionView layoutModelAtIndexPath: indexPath];
// Update attributes here ...
return layoutModel;
}Donc, si vous souhaitez masquer l'étiquette supérieure ou l'étiquette inférieure, vous avez juste besoin de régler leur hauteur sur 0.
QMChatViewController prend en charge les messages de cellules d'attachement d'image. QMChatAttachmentIncomingCell est utilisé pour les attachements entrants, QMChatAttachmentOutgoingCell est utilisé pour les pièces jointes sortantes. Tous deux ont une étiquette de progression pour afficher la progression du chargement. Les XIB sont également inclus.
QMChatViewController contient son gestionnaire de source de données appelé QMChatDataSource . Il a l'implémentation de toutes les méthodes, que vous devez travailler avec QMChatViewController . Cette classe doit être utilisée pour ajouter, mettre à jour et supprimer les messages de la source de données. QMChatDataSource a délégué, qui appelait chaque fois que la source de données était modifiée.
Pour plus d'informations sur les méthodes et son utilisation, consultez notre DOC en ligne dans QMChatDataSource.h .
Documentation du code en ligne disponible.
Voir la licence