256 lines
9.7 KiB
Objective-C
256 lines
9.7 KiB
Objective-C
//
|
|
// MessageContentChatHallHeadView.m
|
|
// YuMi
|
|
//
|
|
// Created by duoban on 2024/5/16.
|
|
//
|
|
|
|
#import "MessageContentChatHallHeadView.h"
|
|
#import "DJDKMIMOMColor.h"
|
|
#import "NSObject+MJExtension.h"
|
|
#import "QEmotionHelper.h"
|
|
#import <SVGA.h>
|
|
#import "XPSVGAPlayer.h"
|
|
#import <NIMSDK/NIMSDK.h>
|
|
#import <Masonry/Masonry.h>
|
|
#import "SpriteSheetImageManager.h"
|
|
#import "MessageHeadlinesTextModel.h"
|
|
#import "XPMessageRemoteExtModel.h"
|
|
#import "MSSessionPublicChatHalImageModel.h"
|
|
@interface MessageContentChatHallHeadView()
|
|
@property(nonatomic,assign) BOOL isSelf;
|
|
///头饰
|
|
@property (nonatomic,strong) YYAnimatedImageView *headWearImageView;
|
|
@property (nonatomic,strong) XPSVGAPlayer *headWearSVGAImageView;
|
|
///头饰播放
|
|
@property (nonatomic, strong) SpriteSheetImageManager *manager;
|
|
/**
|
|
左侧头像(私聊对象)
|
|
*/
|
|
@property (nonatomic, strong) NetImageView * avatarView;
|
|
|
|
@property(nonatomic,strong) UILabel *nameView;
|
|
|
|
@property(nonatomic,strong) NetImageView *expertImage;
|
|
@property(nonatomic,strong) NetImageView *charmImage;
|
|
|
|
@property (nonatomic, strong) SVGAParser *parser;
|
|
|
|
@end
|
|
@implementation MessageContentChatHallHeadView
|
|
|
|
-(instancetype)initWithFrame:(CGRect)frame isSelf:(BOOL)isSelf{
|
|
self = [super initWithFrame:frame];
|
|
if(self){
|
|
self.isSelf = isSelf;
|
|
[self installUI];
|
|
[self installConstraints];
|
|
}
|
|
return self;
|
|
}
|
|
-(void)installUI{
|
|
[self addSubview:self.avatarView];
|
|
[self addSubview:self.headWearImageView];
|
|
[self addSubview:self.headWearSVGAImageView];
|
|
[self addSubview:self.nameView];
|
|
[self addSubview:self.expertImage];
|
|
[self addSubview:self.charmImage];
|
|
}
|
|
-(void)installConstraints{
|
|
if(self.isSelf){
|
|
[self.avatarView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.trailing.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.avatarView).with.insets(UIEdgeInsetsMake(-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10)));
|
|
}];
|
|
[self.headWearSVGAImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.edges.equalTo(self.avatarView).with.insets(UIEdgeInsetsMake(-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10)));
|
|
}];
|
|
[self.nameView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.mas_equalTo(kGetScaleWidth(21));
|
|
make.height.mas_equalTo(kGetScaleWidth(18));
|
|
make.trailing.mas_equalTo(-kGetScaleWidth(72));
|
|
make.leading.equalTo(self.expertImage.mas_trailing).mas_offset(kGetScaleWidth(4));
|
|
|
|
}];
|
|
[self.expertImage mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.width.mas_equalTo(kGetScaleWidth(36));
|
|
make.height.mas_equalTo(kGetScaleWidth(18));
|
|
make.leading.equalTo(self.charmImage.mas_trailing).mas_offset(kGetScaleWidth(4));
|
|
make.centerY.equalTo(self.nameView);
|
|
}];
|
|
[self.charmImage mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.width.mas_equalTo(kGetScaleWidth(36));
|
|
make.height.mas_equalTo(kGetScaleWidth(18));
|
|
make.leading.mas_greaterThanOrEqualTo(kGetScaleWidth(kGetScaleWidth(64)));
|
|
make.centerY.equalTo(self.nameView);
|
|
}];
|
|
return;
|
|
}
|
|
[self.avatarView 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.avatarView).with.insets(UIEdgeInsetsMake(-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10)));
|
|
}];
|
|
[self.headWearSVGAImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.edges.equalTo(self.avatarView).with.insets(UIEdgeInsetsMake(-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10),-kGetScaleWidth(10)));
|
|
}];
|
|
[self.nameView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.top.mas_equalTo(kGetScaleWidth(21));
|
|
make.height.mas_equalTo(kGetScaleWidth(18));
|
|
make.leading.mas_equalTo(kGetScaleWidth(72));
|
|
make.trailing.equalTo(self.expertImage.mas_leading).mas_offset(-kGetScaleWidth(4));
|
|
|
|
}];
|
|
[self.expertImage mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.width.mas_equalTo(kGetScaleWidth(36));
|
|
make.height.mas_equalTo(kGetScaleWidth(18));
|
|
make.trailing.equalTo(self.charmImage.mas_leading).mas_offset(-kGetScaleWidth(4));
|
|
make.centerY.equalTo(self.nameView);
|
|
}];
|
|
[self.charmImage mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.width.mas_equalTo(kGetScaleWidth(36));
|
|
make.height.mas_equalTo(kGetScaleWidth(18));
|
|
make.trailing.mas_lessThanOrEqualTo(-kGetScaleWidth(64));
|
|
make.centerY.equalTo(self.nameView);
|
|
}];
|
|
}
|
|
|
|
- (void)render:(nonnull MessageBaseModel *)model {
|
|
XPMessageRemoteExtModel *extModel ;
|
|
if([model isKindOfClass:[MSSessionPublicChatHalImageModel class]]){
|
|
MSSessionPublicChatHalImageModel *imageModel = (MSSessionPublicChatHalImageModel *)model;
|
|
extModel = imageModel.extModel;
|
|
}else{
|
|
MessageHeadlinesTextModel * textModel = (MessageHeadlinesTextModel *)model;
|
|
extModel = textModel.extModel;
|
|
}
|
|
|
|
if(extModel == nil)return;
|
|
@kWeakify(self);
|
|
self.avatarView.image = nil;
|
|
[self.avatarView loadImageWithUrl:extModel.avatar completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) {
|
|
@kStrongify(self);
|
|
self.avatarView.image = image;
|
|
}];
|
|
self.expertImage.image = nil;
|
|
[self.expertImage loadImageWithUrl:extModel.experUrl completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) {
|
|
@kStrongify(self);
|
|
self.expertImage.image = image;
|
|
}];
|
|
self.charmImage.image = nil;
|
|
[self.charmImage loadImageWithUrl:extModel.charmUrl completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) {
|
|
@kStrongify(self);
|
|
self.charmImage.image = image;
|
|
}];
|
|
self.nameView.text = extModel.nick;
|
|
|
|
self.headWearImageView.image = nil;
|
|
|
|
[self.headWearSVGAImageView stopAnimation];
|
|
[self.headWearSVGAImageView clear];
|
|
|
|
NSString *headwearUrl = extModel.headWearUrl;
|
|
if (headwearUrl.length > 0) {
|
|
@kWeakify(self);
|
|
if (extModel.headWearType == 1 || [headwearUrl hasSuffix:@"svga"]) {
|
|
self.headWearImageView.hidden = YES;
|
|
self.headWearSVGAImageView.hidden = NO;
|
|
// [self.headWearSVGAImageView setImageName:headwearUrl];
|
|
[self.parser parseWithURL:[NSURL URLWithString:headwearUrl] completionBlock:^(SVGAVideoEntity * _Nullable videoItem) {
|
|
@kStrongify(self);
|
|
self.headWearSVGAImageView.videoItem = videoItem;
|
|
[self.headWearSVGAImageView startAnimation];
|
|
} failureBlock:^(NSError * _Nullable error) {
|
|
|
|
}];
|
|
} else {
|
|
self.headWearImageView.hidden = NO;
|
|
self.headWearSVGAImageView.hidden = YES;
|
|
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) {
|
|
}];
|
|
}
|
|
}
|
|
}
|
|
|
|
#pragma mark - 懒加载
|
|
- (NetImageView *)avatarView{
|
|
if(!_avatarView){
|
|
NetImageConfig *config = [NetImageConfig new];
|
|
config.placeHolder = [UIImageConstant defaultAvatarPlaceholder];
|
|
_avatarView = [[NetImageView alloc]initWithConfig:config];
|
|
_avatarView.layer.cornerRadius = kGetScaleWidth(48)/2;
|
|
_avatarView.layer.masksToBounds = YES;
|
|
}
|
|
return _avatarView;
|
|
}
|
|
|
|
- (UILabel *)nameView{
|
|
if(!_nameView){
|
|
_nameView = [UILabel labelInitWithText:@"" font:kFontBold(14) textColor:UIColorFromRGB(0x333333)];
|
|
_nameView.lineBreakMode = self.isSelf ? NSLineBreakByTruncatingHead : NSLineBreakByTruncatingTail;
|
|
}
|
|
return _nameView;
|
|
}
|
|
- (YYAnimatedImageView *)headWearImageView {
|
|
if (!_headWearImageView) {
|
|
_headWearImageView = [[YYAnimatedImageView alloc] init];
|
|
_headWearImageView.backgroundColor = [UIColor clearColor];
|
|
_headWearImageView.contentMode = UIViewContentModeScaleAspectFit;
|
|
}
|
|
return _headWearImageView;
|
|
}
|
|
|
|
- (XPSVGAPlayer *)headWearSVGAImageView {
|
|
if (!_headWearSVGAImageView) {
|
|
_headWearSVGAImageView = [[XPSVGAPlayer alloc]init];
|
|
_headWearSVGAImageView.backgroundColor = [UIColor clearColor];
|
|
_headWearSVGAImageView.frame = CGRectZero;
|
|
_headWearSVGAImageView.userInteractionEnabled = NO;
|
|
_headWearSVGAImageView.loops = 0;
|
|
_headWearSVGAImageView.autoPlay = YES;
|
|
_headWearSVGAImageView.clearsAfterStop = YES;
|
|
}
|
|
return _headWearSVGAImageView;
|
|
}
|
|
|
|
- (SpriteSheetImageManager *)manager {
|
|
if (!_manager) {
|
|
_manager = [[SpriteSheetImageManager alloc] init];
|
|
}
|
|
return _manager;
|
|
}
|
|
- (NetImageView *)expertImage{
|
|
if(!_expertImage){
|
|
_expertImage = [NetImageView new];
|
|
}
|
|
return _expertImage;
|
|
}
|
|
- (NetImageView *)charmImage{
|
|
if(!_charmImage){
|
|
_charmImage = [NetImageView new];
|
|
}
|
|
return _charmImage;
|
|
}
|
|
|
|
- (SVGAParser *)parser {
|
|
if (!_parser) {
|
|
_parser = [[SVGAParser alloc] init];
|
|
_parser.enabledMemoryCache = YES;
|
|
}
|
|
return _parser;
|
|
}
|
|
|
|
@end
|