Files
peko-ios/YuMi/Modules/YMMessage/View/Session/Cell/MSSessionPublicChatHalImageCell.m
2024-05-16 09:45:11 +08:00

429 lines
16 KiB
Objective-C

//
// MSSessionPublicChatHalImageCell.m
// YuMi
//
// Created by duoban on 2024/5/10.
//
#import "DJDKMIMOMColor.h"
#import "NSObject+MJExtension.h"
#import "QEmotionHelper.h"
#import <NIMSDK/NIMSDK.h>
#import <Masonry/Masonry.h>
#import "SpriteSheetImageManager.h"
#import "MessageHeadlinesTextModel.h"
#import "XPMessageRemoteExtModel.h"
#import "MSSessionPublicChatHalImageCell.h"
#import "MSSessionPublicChatHalImageModel.h"
#import "SDPhotoBrowser.h"
@interface MSSessionPublicChatHalImageCell()<SDPhotoBrowserDelegate>
@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