// // 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