Files
peko-ios/YuMi/Modules/YMMessage/View/Session/Content/MessageContentChatHallHeadView.m
eggmanQQQ d9aedceebc 1. 修正 XPSVGAPlayer 中过期方法的处理
2. 移除房间的测试用动画
3. 优化进房效果
2024-07-19 16:26:51 +08:00

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