123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- //
- // EMMessageCell.m
- // ChatDemo-UI3.0
- //
- // Created by XieYajie on 2019/1/25.
- // Copyright © 2019 XieYajie. All rights reserved.
- //
- #import "EMMessageCell.h"
- #import "EMMessageStatusView.h"
- #import "EMMsgTextBubbleView.h"
- #import "EMMsgImageBubbleView.h"
- #import "EMMsgAudioBubbleView.h"
- #import "EMMsgVideoBubbleView.h"
- #import "EMMsgLocationBubbleView.h"
- #import "EMMsgFileBubbleView.h"
- #import "EMMsgExtGifBubbleView.h"
- #import "EMMsgExtSmartBubbleView.h"
- @interface EMMessageCell()
- @property (nonatomic, strong) UIImageView *avatarView;
- @property (nonatomic, strong) UILabel *nameLabel;
- @property (nonatomic, strong) EMMessageStatusView *statusView;
- @property (nonatomic, strong) UIButton *readReceiptBtn;//阅读回执按钮
- @end
- @implementation EMMessageCell
- - (instancetype)initWithDirection:(EMMessageDirection)aDirection
- type:(EMMessageType)aType
- {
- NSString *identifier = [EMMessageCell cellIdentifierWithDirection:aDirection type:aType];
- self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
- if (self) {
- _direction = aDirection;
- [self _setupViewsWithType:aType];
- }
-
- return self;
- }
- - (void)awakeFromNib {
- [super awakeFromNib];
- // Initialization code
- }
- - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
- [super setSelected:selected animated:animated];
- // Configure the view for the selected state
- }
- #pragma mark - Class Methods
- + (NSString *)cellIdentifierWithDirection:(EMMessageDirection)aDirection
- type:(EMMessageType)aType
- {
- NSString *identifier = @"EMMsgCellDirectionSend";
- if (aDirection == EMMessageDirectionReceive) {
- identifier = @"EMMsgCellDirectionRecv";
- }
-
- if (aType == EMMessageTypeText || aType == EMMessageTypeExtCall) {
- identifier = [NSString stringWithFormat:@"%@Text", identifier];
- } else if (aType == EMMessageTypeImage) {
- identifier = [NSString stringWithFormat:@"%@Image", identifier];
- } else if (aType == EMMessageTypeVoice) {
- identifier = [NSString stringWithFormat:@"%@Voice", identifier];
- } else if (aType == EMMessageTypeVideo) {
- identifier = [NSString stringWithFormat:@"%@Video", identifier];
- } else if (aType == EMMessageTypeLocation) {
- identifier = [NSString stringWithFormat:@"%@Location", identifier];
- } else if (aType == EMMessageTypeFile) {
- identifier = [NSString stringWithFormat:@"%@File", identifier];
- } else if (aType == EMMessageTypeExtGif) {
- identifier = [NSString stringWithFormat:@"%@ExtGif", identifier];
- } else if (aType == EMMessageTypeExtApp) {
- identifier = [NSString stringWithFormat:@"%@App", identifier];
- }
-
- return identifier;
- }
- #pragma mark - Subviews
- - (void)_setupViewsWithType:(EMMessageType)aType
- {
- self.selectionStyle = UITableViewCellSelectionStyleNone;
- self.backgroundColor = kColor_LightGray;
- self.contentView.backgroundColor = kColor_LightGray;
-
- _avatarView = [[UIImageView alloc] init];
- _avatarView.contentMode = UIViewContentModeScaleAspectFit;
- _avatarView.backgroundColor = [UIColor clearColor];
- _avatarView.userInteractionEnabled = YES;
- _avatarView.layer.cornerRadius = 4.f;
- _avatarView.layer.masksToBounds = YES;
- [self.contentView addSubview:_avatarView];
- if (self.direction == EMMessageDirectionSend) {
- // _avatarView.image = [UIImage imageNamed:@"user_avatar_me"];
- [_avatarView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.mas_equalTo(self.contentView).mas_offset(15);
- make.right.mas_equalTo(self.contentView).mas_offset(-10);
- make.width.height.mas_equalTo(@40);
- }];
- } else {
- // _avatarView.image = [UIImage imageNamed:@"user_avatar_blue"];
- [_avatarView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.mas_equalTo(self.contentView).mas_offset(15);
- make.left.mas_equalTo(self.contentView).mas_offset(10);
- make.width.height.mas_equalTo(@40);
- }];
-
- _nameLabel = [[UILabel alloc] init];
- _nameLabel.font = [UIFont systemFontOfSize:13];
- _nameLabel.textColor = [UIColor grayColor];
- [self.contentView addSubview:_nameLabel];
- [_nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.mas_equalTo(self.avatarView);
- make.left.mas_equalTo(self.avatarView.mas_right).mas_offset(8);
- make.right.mas_equalTo(self.contentView).mas_offset(-10);
- }];
- }
-
- _bubbleView = [self _getBubbleViewWithType:aType];
- _bubbleView.userInteractionEnabled = YES;
- _bubbleView.clipsToBounds = YES;
- [self.contentView addSubview:_bubbleView];
- if (self.direction == EMMessageDirectionSend) {
- [_bubbleView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.mas_equalTo(self.avatarView);
- make.bottom.mas_equalTo(self.contentView).mas_offset(-15).priority(500);
- make.left.greaterThanOrEqualTo(self.contentView).mas_offset(70);
- make.right.mas_equalTo(self.avatarView.mas_left).mas_offset(-10);
- }];
- } else {
- [_bubbleView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.mas_equalTo(self.nameLabel.mas_bottom).mas_offset(3);
- make.bottom.mas_equalTo(self.contentView).mas_offset(-15).priority(500);
- make.left.mas_equalTo(self.avatarView.mas_right).mas_offset(10);
- make.right.lessThanOrEqualTo(self.contentView).mas_offset(-70);
- }];
- }
- _statusView = [[EMMessageStatusView alloc] init];
- [self.contentView addSubview:_statusView];
- if (self.direction == EMMessageDirectionSend) {
- [_statusView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.centerY.mas_equalTo(self.bubbleView.mas_centerY);
- make.right.mas_equalTo(self.bubbleView.mas_left).mas_offset(-8);
- make.height.mas_equalTo(@20);
- }];
- __weak typeof(self) weakself = self;
- [_statusView setResendCompletion:^{
- if (weakself.delegate && [weakself.delegate respondsToSelector:@selector(messageCellDidResend:)]) {
- [weakself.delegate messageCellDidResend:weakself.model];
- }
- }];
- } else {
- _statusView.backgroundColor = [UIColor redColor];
- _statusView.clipsToBounds = YES;
- _statusView.layer.cornerRadius = 4;
- [_statusView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.mas_equalTo(self.bubbleView).mas_offset(5);
- make.left.mas_equalTo(self.bubbleView.mas_right).mas_offset(5);
- make.width.height.mas_equalTo(@8);
- }];
- }
- [self setCellIsReadReceipt];
-
- }
- - (void)setCellIsReadReceipt{
- _readReceiptBtn = [[UIButton alloc]init];
- _readReceiptBtn.layer.cornerRadius = 5;
- //[_readReceiptBtn setTitle:self.model.readReceiptCount forState:UIControlStateNormal];
- _readReceiptBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
- _readReceiptBtn.backgroundColor = [UIColor lightGrayColor];
- [_readReceiptBtn.titleLabel setTextColor:[UIColor whiteColor]];
- _readReceiptBtn.titleLabel.font = [UIFont systemFontOfSize: 10.0];
- [_readReceiptBtn addTarget:self action:@selector(readReceiptDetilAction) forControlEvents:UIControlEventTouchUpInside];
- [self.contentView addSubview:_readReceiptBtn];
- if(self.direction == EMMessageDirectionSend) {
- [_readReceiptBtn mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.mas_equalTo(self.bubbleView.mas_bottom).mas_offset(2);
- make.right.mas_equalTo(self.bubbleView.mas_right);
- make.width.mas_equalTo(@130);
- make.height.mas_equalTo(@15);
- }];
- }
- }
- - (EMMessageBubbleView *)_getBubbleViewWithType:(EMMessageType)aType
- {
- EMMessageBubbleView *bubbleView = nil;
- switch (aType) {
- case EMMessageTypeText:
- case EMMessageTypeExtCall:
- bubbleView = [[EMMsgTextBubbleView alloc] initWithDirection:self.direction type:aType];
- break;
- case EMMessageTypeImage:
- bubbleView = [[EMMsgImageBubbleView alloc] initWithDirection:self.direction type:aType];
- break;
- case EMMessageTypeVoice:
- bubbleView = [[EMMsgAudioBubbleView alloc] initWithDirection:self.direction type:aType];
- break;
- case EMMessageTypeVideo:
- bubbleView = [[EMMsgVideoBubbleView alloc] initWithDirection:self.direction type:aType];
- break;
- case EMMessageTypeLocation:
- bubbleView = [[EMMsgLocationBubbleView alloc] initWithDirection:self.direction type:aType];
- break;
- case EMMessageTypeFile:
- bubbleView = [[EMMsgFileBubbleView alloc] initWithDirection:self.direction type:aType];
- break;
- case EMMessageTypeExtGif:
- bubbleView = [[EMMsgExtGifBubbleView alloc] initWithDirection:self.direction type:aType];
- break;
- case EMMessageTypeExtApp:
- bubbleView = [[EMMsgExtSmartBubbleView alloc] initWithDirection:self.direction type:aType];
- break;
- default:
- break;
- }
- if (bubbleView) {
- UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(bubbleViewTapAction:)];
- [bubbleView addGestureRecognizer:tap];
-
- UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(bubbleViewLongPressAction:)];
- [bubbleView addGestureRecognizer:longPress];
- }
-
- return bubbleView;
- }
- #pragma mark - Setter
- - (void)setIconUrl:(NSString *)IconUrl
- {
- _IconUrl = IconUrl;
- [_avatarView sd_setImageWithURL:[NSURL URLWithString:IconUrl] placeholderImage:kUserDefaultHeadImage];
- WS(weakSelf);
- UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithActionBlock:^(id _Nonnull sender) {
- if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(messageClickUserIcon:)]) {
- [weakSelf.delegate messageClickUserIcon:weakSelf];
- }
- }];
- [_avatarView addGestureRecognizer:tap];
- _avatarView.userInteractionEnabled = YES;
- }
- - (void)setModel:(EMMessageModel *)model
- {
- _model = model;
- self.bubbleView.model = model;
- if (model.direction == EMMessageDirectionSend) {
- [self.statusView setSenderStatus:model.emModel.status isReadAcked:model.emModel.isReadAcked type:model.emModel.chatType];
- } else {
- self.nameLabel.text = model.emModel.from;
- if (model.type == EMMessageBodyTypeVoice) {
- self.statusView.hidden = model.emModel.isReadAcked;
- }
- }
- if(model.emModel.isNeedGroupAck) {
- self.readReceiptBtn.hidden = NO;
- [self.readReceiptBtn setTitle:_model.readReceiptCount forState:UIControlStateNormal];
- }else{
- self.readReceiptBtn.hidden = YES;
- }
- }
- #pragma mark - Action
- - (void)readReceiptDetilAction {
- if (self.delegate && [self.delegate respondsToSelector:@selector(messageReadReceiptDetil:)]) {
- [self.delegate messageReadReceiptDetil:self];
- }
- }
- - (void)bubbleViewTapAction:(UITapGestureRecognizer *)aTap
- {
- if (aTap.state == UIGestureRecognizerStateEnded) {
- if (self.delegate && [self.delegate respondsToSelector:@selector(messageCellDidSelected:)]) {
- [self.delegate messageCellDidSelected:self];
- }
- }
- }
- - (void)bubbleViewLongPressAction:(UILongPressGestureRecognizer *)aLongPress
- {
- if (aLongPress.state == UIGestureRecognizerStateBegan) {
- if (self.delegate && [self.delegate respondsToSelector:@selector(messageCellDidLongPress:)]) {
- [self.delegate messageCellDidLongPress:self];
- }
- }
- }
- @end
|