429 lines
16 KiB
Objective-C
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
|