// // MoliAvatar.m // YuMi // // Created by P on 2024/12/11. // #import "MoliAvatar.h" #import "UserInfoModel.h" #import #import #import "UIView+VAP.h" #import "SpriteSheetImageManager.h" @interface MoliAvatar () @property (nonatomic,strong) NetImageView *avatarView; ///序列帧 @property (nonatomic, strong) SpriteSheetImageManager *sequenceFrameManager; @property (nonatomic,strong) YYAnimatedImageView *sequenceFrameHeadWear; ///SVGA @property (nonatomic, strong) SVGAImageView *headWearSvgaImageView; @end @implementation MoliAvatar - (void)dealloc { if (_headWearSvgaImageView) { [_headWearSvgaImageView stopAnimation]; } } - (instancetype)init { if (self = [super init]) { [self addSubview:self.avatarView]; [self.avatarView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self); }]; } return self; } - (void)layoutSubviews { [super layoutSubviews]; [self.avatarView setCornerRadius:self.frame.size.height / 2]; } - (void)setUserInfo:(UserInfoModel *)userInfo { _userInfo = userInfo; self.avatarView.imageUrl = userInfo.avatar; NSString *headerUrl = self.userInfo.headwearEffect.length > 0 ? self.userInfo.headwearEffect : self.userInfo.headwearPic; if ([NSString isEmpty:headerUrl]) { return; } if ([userInfo isHeadWearSVGA]) { [self setupAndPlaySVGA: headerUrl]; } else { [self setupAndPlayAnimate: headerUrl]; } } - (void)setupAndPlaySVGA:(NSString *)url { [self addSubview:self.headWearSvgaImageView]; [self.headWearSvgaImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.center.mas_equalTo(self.avatarView); make.size.mas_equalTo(self.avatarView).multipliedBy(1.4); }]; [self.headWearSvgaImageView setImageName:url]; } - (void)setupAndPlayAnimate:(NSString *)url { [self addSubview:self.sequenceFrameHeadWear]; [self.sequenceFrameHeadWear mas_makeConstraints:^(MASConstraintMaker *make) { make.center.mas_equalTo(self.avatarView); make.size.mas_equalTo(self.avatarView).multipliedBy(1.4); }]; @kWeakify(self); [self.sequenceFrameManager loadSpriteSheetImageWithURL:[NSURL URLWithString:url] completionBlock:^(YYSpriteSheetImage * _Nullable sprit) { @kStrongify(self); self.sequenceFrameHeadWear.image = sprit; } failureBlock:^(NSError * _Nullable error) {}]; } #pragma mark - - (void)clickAvatarAction { if (self.handleTapAvatar) { self.handleTapAvatar(); } } #pragma mark - #pragma mark - -(NetImageView *)avatarView{ if (!_avatarView){ NetImageConfig * config = [[NetImageConfig alloc] init]; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; config.imageType = ImageTypeUserIcon; _avatarView = [[NetImageView alloc]initWithConfig:config]; _avatarView.layer.cornerRadius = kGetScaleWidth(41); _avatarView.layer.masksToBounds = YES; _avatarView.layer.borderWidth = 1; _avatarView.userInteractionEnabled = YES; _avatarView.layer.borderColor = [UIColor whiteColor].CGColor; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickAvatarAction)]; [_avatarView addGestureRecognizer:tap]; } return _avatarView; } - (SVGAImageView *)headWearSvgaImageView { if (!_headWearSvgaImageView) { _headWearSvgaImageView = [[SVGAImageView alloc]init]; _headWearSvgaImageView.backgroundColor = [UIColor clearColor]; _headWearSvgaImageView.frame = self.bounds; _headWearSvgaImageView.userInteractionEnabled = NO; _headWearSvgaImageView.autoPlay = YES; } return _headWearSvgaImageView; } - (YYAnimatedImageView *)sequenceFrameHeadWear { if (!_sequenceFrameHeadWear) { _sequenceFrameHeadWear = [[YYAnimatedImageView alloc] init]; _sequenceFrameHeadWear.backgroundColor = [UIColor clearColor]; _sequenceFrameHeadWear.contentMode = UIViewContentModeScaleAspectFit; } return _sequenceFrameHeadWear; } - (SpriteSheetImageManager *)sequenceFrameManager { if (!_sequenceFrameManager) { _sequenceFrameManager = [[SpriteSheetImageManager alloc] init]; } return _sequenceFrameManager; } @end