// // MSSessionPublicChatHalImageCell.m // YuMi // // Created by duoban on 2024/5/10. // #import "DJDKMIMOMColor.h" #import "NSObject+MJExtension.h" #import "QEmotionHelper.h" #import #import #import "SpriteSheetImageManager.h" #import "MessageHeadlinesTextModel.h" #import "XPMessageRemoteExtModel.h" #import "MSSessionPublicChatHalImageCell.h" #import "MSSessionPublicChatHalImageModel.h" #import "SDPhotoBrowser.h" @interface MSSessionPublicChatHalImageCell() @property(nonatomic,strong) MSSessionPublicChatHalImageModel * imageModel; ///当前的消息 @property (nonatomic,strong) NIMMessage *message; ///头饰 @property (nonatomic,strong) YYAnimatedImageView *headWearImageView; ///头饰 @property (nonatomic,strong) YYAnimatedImageView *rightHeadWearImageView; ///头饰播放 @property (nonatomic, strong) SpriteSheetImageManager *manager; /** 左侧头像(私聊对象) */ @property (nonatomic, strong) NetImageView * leftAvatar; /** 右侧头像(自己) */ @property (nonatomic, strong) NetImageView * rightAvatar; @property(nonatomic,strong) YYLabel *leftNameView; @property(nonatomic,strong) UIImageView *leftBgImage; @property(nonatomic,strong) UIImageView *rightBgImage; ///气泡 @property (nonatomic,strong) NetImageView *leftBubbleImageView; ///气泡 @property (nonatomic,strong) NetImageView *rightBubbleImageView; @property(nonatomic,strong) NetImageView *leftPicImageView; @property(nonatomic,strong) NetImageView *rightPicImageView; @end @implementation MSSessionPublicChatHalImageCell -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if(self){ [self installUI]; [self installConstraints]; } return self; } -(void)installUI{ self.contentView.backgroundColor = [UIColor clearColor]; self.backgroundColor = [UIColor clearColor]; self.selectionStyle = 0; [self addSubview:self.leftAvatar]; [self addSubview:self.headWearImageView]; [self addSubview:self.rightAvatar]; [self addSubview:self.rightHeadWearImageView]; [self addSubview:self.leftNameView]; [self addSubview:self.leftBgImage]; [self addSubview:self.rightBgImage]; [self addSubview:self.leftBubbleImageView]; [self addSubview:self.rightBubbleImageView]; [self.leftBgImage addSubview:self.leftPicImageView]; [self.rightBgImage addSubview:self.rightPicImageView]; } -(void)installConstraints{ [self.leftAvatar mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.mas_equalTo(kGetScaleWidth(15)); make.width.height.mas_equalTo(kGetScaleWidth(48)); make.top.mas_equalTo(kGetScaleWidth(10)); }]; [self.headWearImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.leftAvatar).with.insets(UIEdgeInsetsMake(kGetScaleWidth(10),kGetScaleWidth(10),kGetScaleWidth(10),kGetScaleWidth(10))); }]; [self.leftNameView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(kGetScaleWidth(21)); make.height.mas_equalTo(kGetScaleWidth(14)); make.leading.mas_equalTo(kGetScaleWidth(72)); make.width.mas_lessThanOrEqualTo(kGetScaleWidth(240)); }]; [self.rightAvatar mas_makeConstraints:^(MASConstraintMaker *make) { make.top.width.height.equalTo(self.leftAvatar); make.trailing.mas_equalTo(-kGetScaleWidth(15)); }]; [self.rightHeadWearImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.rightAvatar).with.insets(UIEdgeInsetsMake(-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10))); }]; [self.leftBgImage mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.mas_equalTo(kGetScaleWidth(72)); make.width.mas_equalTo(kGetScaleWidth(52)); make.height.mas_equalTo(kGetScaleWidth(36)); make.top.mas_equalTo(kGetScaleWidth(45)); }]; [self.rightBgImage mas_makeConstraints:^(MASConstraintMaker *make) { make.trailing.mas_equalTo(-kGetScaleWidth(72)); make.centerY.equalTo(self.rightAvatar); make.width.mas_equalTo(kGetScaleWidth(52)); make.height.mas_greaterThanOrEqualTo(kGetScaleWidth(36)); }]; [self.leftBubbleImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.leftBgImage); }]; [self.rightBubbleImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.rightBgImage); }]; [self.leftPicImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.leftBgImage).with.insets(UIEdgeInsetsMake(kGetScaleWidth(10),kGetScaleWidth(10),kGetScaleWidth(10),kGetScaleWidth(10))); }]; [self.rightPicImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.rightBgImage).with.insets(UIEdgeInsetsMake(kGetScaleWidth(10),kGetScaleWidth(10),kGetScaleWidth(10),kGetScaleWidth(10))); }]; self.leftAvatar.hidden = YES; self.leftNameView.hidden = YES; self.leftBgImage.hidden = YES; self.headWearImageView.hidden = YES; self.leftBubbleImageView.hidden = YES; self.rightAvatar.hidden = YES; self.rightBgImage.hidden = YES; self.rightHeadWearImageView.hidden = YES; self.rightBubbleImageView.hidden = YES; } #pragma mark - 懒加载 - (void)render:(nonnull MessageBaseModel *)model { self.message = model.message; MSSessionPublicChatHalImageModel * imageModel = (MSSessionPublicChatHalImageModel *)model; self.imageModel = imageModel; XPMessageRemoteExtModel *extModel = imageModel.extModel; if(extModel == nil)return; self.leftAvatar.hidden = YES; self.leftNameView.hidden = YES; self.leftBgImage.hidden = YES; self.headWearImageView.hidden = YES; self.leftPicImageView.hidden = YES; self.rightPicImageView.hidden = YES; self.leftBubbleImageView.hidden = YES; self.rightAvatar.hidden = YES; self.rightBgImage.hidden = YES; self.rightHeadWearImageView.hidden = YES; self.rightBubbleImageView.hidden = YES; if(imageModel.isSelf){ [self.rightPicImageView mas_updateConstraints:^(MASConstraintMaker *make) { make.height.mas_equalTo(model.contentSize.height); make.width.mas_equalTo(model.contentSize.width); }]; if (imageModel.image) { self.rightPicImageView.image = imageModel.image; }else { [self.rightPicImageView loadImageWithUrl:imageModel.imageUrl completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) { self.rightPicImageView.image = image; }]; } [self.rightBgImage mas_remakeConstraints:^(MASConstraintMaker *make) { make.trailing.mas_equalTo(-kGetScaleWidth(72)); make.top.mas_equalTo(kGetScaleWidth(21)); make.width.mas_equalTo(model.contentSize.width+kGetScaleWidth(10)); make.height.mas_equalTo(model.contentSize.height+kGetScaleWidth(10)); }]; self.rightAvatar.hidden = NO; self.rightBgImage.hidden = NO; self.rightHeadWearImageView.hidden = NO; self.rightBubbleImageView.hidden = NO; self.leftPicImageView.hidden = YES; self.rightPicImageView.hidden = NO; self.rightAvatar.image = nil; [self.rightAvatar loadImageWithUrl:extModel.avatar completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) { self.rightAvatar.image = image; }]; self.rightBubbleImageView.image = nil; self.rightBgImage.image = [self resizableImage:kImage(@"ms_message_headlines_text_right")]; [self.rightBubbleImageView loadImageWithUrl:extModel.iosBubbleUrl completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) { self.rightBgImage.image = nil; UIImage *image1 = [UIImage imageWithCGImage:image.CGImage scale:2.0 orientation:UIImageOrientationUp]; self.rightBubbleImageView.image = [self resizableImage:image1]; }]; NSString *headwearUrl = extModel.headwearUrl; self.rightHeadWearImageView.image = nil; if (headwearUrl.length > 0) { NSURL *url = [NSURL URLWithString:headwearUrl]; @kWeakify(self); [self.manager loadSpriteSheetImageWithURL:url completionBlock:^(YYSpriteSheetImage * _Nullable sprit) { @kStrongify(self); self.rightHeadWearImageView.image = sprit; } failureBlock:^(NSError * _Nullable error) { }]; } return; } [self.leftPicImageView mas_updateConstraints:^(MASConstraintMaker *make) { make.height.mas_equalTo(model.contentSize.height); make.width.mas_equalTo(model.contentSize.width); }]; if (imageModel.image) { self.leftPicImageView.image = imageModel.image; }else { [self.leftPicImageView loadImageWithUrl:imageModel.imageUrl completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) { self.leftPicImageView.image = image; }]; } [self.leftBgImage mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(kGetScaleWidth(45)); make.leading.mas_equalTo(kGetScaleWidth(72)); make.width.mas_equalTo(model.contentSize.width+kGetScaleWidth(10)); make.height.mas_equalTo(model.contentSize.height+kGetScaleWidth(10)); }]; NSString *headwearUrl = extModel.headwearUrl; self.headWearImageView.image = nil; if (headwearUrl.length > 0) { NSURL *url = [NSURL URLWithString:headwearUrl]; @kWeakify(self); [self.manager loadSpriteSheetImageWithURL:url completionBlock:^(YYSpriteSheetImage * _Nullable sprit) { @kStrongify(self); self.headWearImageView.image = sprit; } failureBlock:^(NSError * _Nullable error) { }]; } self.leftAvatar.hidden = NO; self.leftNameView.hidden = NO; self.leftBgImage.hidden = NO; self.headWearImageView.hidden = NO; self.leftPicImageView.hidden = NO; self.rightPicImageView.hidden = YES; self.leftBubbleImageView.hidden = NO; self.leftAvatar.image = nil; [self.leftAvatar loadImageWithUrl:extModel.avatar completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) { self.leftAvatar.image = image; }]; self.leftBgImage.image = [self resizableImage:kImage(@"ms_message_headlines_text_left")]; self.leftBubbleImageView.image = nil; [self.leftBubbleImageView loadImageWithUrl:extModel.iosBubbleUrl completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) { self.leftBgImage.image = nil; UIImage *image1 = [UIImage imageWithCGImage:image.CGImage scale:2.0 orientation:UIImageOrientationUp]; self.leftBubbleImageView.image = [self resizableImage:image1]; }]; self.leftNameView.attributedText = imageModel.nameAtt; } #pragma mark - SDPhotoBrowserDelegate - (NSURL *)photoBrowser:(SDPhotoBrowser *)browser highQualityImageURLForIndex:(NSInteger)index { return [NSURL URLWithString:self.imageModel.url]; } - (UIImage *)photoBrowser:(SDPhotoBrowser *)browser placeholderImageForIndex:(NSInteger)index { return [UIImageConstant defalutBannerPlaceholder]; } - (UIImage *)photoBrowser:(SDPhotoBrowser *)browser highQualityImageForIndex:(NSInteger)index{ if(self.imageModel.url == nil && self.imageModel.image != nil){ return self.imageModel.image; } return nil; } -(void)didLeftTapImage{ SDPhotoBrowser *browser = [[SDPhotoBrowser alloc]init]; browser.sourceImagesContainerView = self; browser.delegate = self; browser.imageCount = 1; browser.currentImageIndex = 0; browser.isMe = NO; [browser show]; } -(void)didRigthTapImage{ SDPhotoBrowser *browser = [[SDPhotoBrowser alloc]init]; browser.sourceImagesContainerView = self; browser.delegate = self; browser.imageCount = 1; browser.currentImageIndex = 0; browser.isMe = NO; [browser show]; } - (UIImage*)resizableImage:(UIImage *)image { //图片拉伸区域 CGFloat top = (image.size.height - 1) / 2; CGFloat left = (image.size.width - 1) / 2; CGFloat right = (image.size.width - 1) / 2; CGFloat bottom = (image.size.height - 1) / 2; return [image resizableImageWithCapInsets:UIEdgeInsetsMake(top, left, bottom, right) resizingMode:UIImageResizingModeStretch]; } - (NetImageView *)leftAvatar{ if(!_leftAvatar){ NetImageConfig *config = [NetImageConfig new]; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; _leftAvatar = [[NetImageView alloc]initWithConfig:config]; _leftAvatar.layer.cornerRadius = kGetScaleWidth(48)/2; _leftAvatar.layer.masksToBounds = YES; } return _leftAvatar; } - (NetImageView *)rightAvatar{ if(!_rightAvatar){ NetImageConfig *config = [NetImageConfig new]; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; _rightAvatar = [[NetImageView alloc]initWithConfig:config]; _rightAvatar.layer.cornerRadius = kGetScaleWidth(48)/2; _rightAvatar.layer.masksToBounds = YES; } return _rightAvatar; } - (YYLabel *)leftNameView{ if(!_leftNameView){ _leftNameView = [YYLabel new]; } return _leftNameView; } - (UIImageView *)leftBgImage{ if(!_leftBgImage){ _leftBgImage = [UIImageView new]; _leftBgImage.userInteractionEnabled = YES; _leftBgImage.image = [self resizableImage:kImage(@"ms_message_headlines_text_left")]; } return _leftBgImage; } - (UIImageView *)rightBgImage{ if(!_rightBgImage){ _rightBgImage = [UIImageView new]; _rightBgImage.userInteractionEnabled = YES; _rightBgImage.image = [self resizableImage:kImage(@"ms_message_headlines_text_right")]; } return _rightBgImage; } - (NetImageView *)leftBubbleImageView{ if(!_leftBubbleImageView){ _leftBubbleImageView = [[NetImageView alloc] init]; } return _leftBubbleImageView; } - (NetImageView *)rightBubbleImageView{ if(!_rightBubbleImageView){ _rightBubbleImageView = [[NetImageView alloc] init]; } return _rightBubbleImageView; } - (YYAnimatedImageView *)headWearImageView { if (!_headWearImageView) { _headWearImageView = [[YYAnimatedImageView alloc] init]; _headWearImageView.backgroundColor = [UIColor clearColor]; _headWearImageView.contentMode = UIViewContentModeScaleAspectFit; } return _headWearImageView; } - (YYAnimatedImageView *)rightHeadWearImageView { if (!_rightHeadWearImageView) { _rightHeadWearImageView = [[YYAnimatedImageView alloc] init]; _rightHeadWearImageView.backgroundColor = [UIColor clearColor]; _rightHeadWearImageView.contentMode = UIViewContentModeScaleAspectFit; } return _rightHeadWearImageView; } - (SpriteSheetImageManager *)manager { if (!_manager) { _manager = [[SpriteSheetImageManager alloc] init]; } return _manager; } - (NetImageView *)leftPicImageView{ if(!_leftPicImageView){ _leftPicImageView = [NetImageView new]; _leftPicImageView.userInteractionEnabled = YES; _leftPicImageView.layer.masksToBounds = YES; _leftPicImageView.contentMode = UIViewContentModeScaleAspectFill; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didLeftTapImage)]; [_leftPicImageView addGestureRecognizer:tap]; } return _leftPicImageView; } - (NetImageView *)rightPicImageView{ if(!_rightPicImageView){ _rightPicImageView = [NetImageView new]; _rightPicImageView.userInteractionEnabled = YES; _rightPicImageView.layer.masksToBounds = YES; _rightPicImageView.contentMode = UIViewContentModeScaleAspectFill; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didRigthTapImage)]; [_rightPicImageView addGestureRecognizer:tap]; } return _rightPicImageView; } @end