// // XPRoomBaseUIView.m // xplan-ios // // Created by 冯硕 on 2021/10/11. // 最下面的View #import "XPRoomBackContainerView.h" ///Third #import #import #import ///Tool #import "XPGiftStorage.h" #import "XPMacro.h" #import "ThemeColor+Room.h" ///Model #import "GiftReceiveInfoModel.h" #import "GiftInfoModel.h" #import "RoomInfoModel.h" #import "AttachmentModel.h" #import "XPGiftBigPrizeModel.h" @interface XPRoomBackContainerView () ///动画管理类 @property (strong, nonatomic) SVGAParser *parser; ///送礼物的特效 @property (nonatomic,strong) SVGAImageView *giftEffectView; /// @property (nonatomic,strong) UIImageView *backImageView; /// @property (nonatomic,weak) iddelegate; ///礼物特效的队列 @property (nonatomic,strong) NSMutableArray *giftEffectQueue; ///礼物特效是否正在播放 @property (nonatomic,assign) BOOL isGiftEffectPlaying; ///礼物价格大于520横幅的队列 @property (nonatomic,strong) NSMutableArray *giftBannerQueue;; ///福袋大礼物的队列 @property (nonatomic,strong) NSMutableArray *bigPrizeGiftQueue; ///福袋 @property (nonatomic,strong)dispatch_source_t luckyprizeTimer; @end @implementation XPRoomBackContainerView - (instancetype)initWithdelegate:(id)delegate { self = [super init]; if (self) { [[NIMSDK sharedSDK].chatManager addDelegate:self]; self.delegate = delegate; [self initSubViews]; [self initSubViewConstraints]; } return self; } #pragma mark - Private Method - (void)initSubViews { [self addSubview:self.backImageView]; } - (void)initSubViewConstraints { [self.backImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self); }]; } #pragma mark - NIMChatManagerDelegate - (void)onRecvMessages:(NSArray *)messages { for (NIMMessage * message in messages) { [self handleMessage:message]; } } //发送消息成功回调 - (void)sendMessage:(NIMMessage *)message didCompleteWithError:(NSError *)error { [self handleMessage:message]; } - (void)handleMessage:(NIMMessage *)message { if (message.session.sessionType == NIMSessionTypeChatroom && message.messageType == NIMMessageTypeCustom) { NIMCustomObject *obj = (NIMCustomObject *)message.messageObject; if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) { AttachmentModel *attachment = (AttachmentModel *)obj.attachment; GiftReceiveInfoModel * receiveInfo = [GiftReceiveInfoModel modelWithJSON:attachment.data]; if (attachment.first == CustomMessageType_Gift) { receiveInfo.isLuckyBagGift = attachment.second == Custom_Message_Sub_Gift_LuckySend; [self receiveGift:receiveInfo]; } else if (attachment.first == CustomMessageType_ALLMicroSend) { //发送全麦礼物 或者多人礼物 receiveInfo.isLuckyBagGift = (attachment.second == Custom_Message_Sub_AllMicroLuckySend || attachment.second == Custom_Message_Sub_AllBatchMicroLuckySend); [self receiveGift:receiveInfo]; } else if (attachment.first == CustomMessageType_LuckyBag) {//福袋消息厅内展示 [self receiveLuckyGiftBigPrize:attachment]; } } } } #pragma mark - 福袋中 四级奖品 - (void)receiveLuckyGiftBigPrize:(AttachmentModel *)attachment { if (attachment.second == Custom_Message_Sub_Room_Gift_LuckBag || attachment.second == Custom_Message_Sub_Room_Gift_LuckBag_Server) { XPGiftBigPrizeModel * prizeModel = [[XPGiftBigPrizeModel alloc] init]; prizeModel.giftName = attachment.data[@"giftName"]; prizeModel.luckyBagName = attachment.data[@"luckyBagName"]; prizeModel.nick = attachment.data[@"nick"]; [self.bigPrizeGiftQueue addObject:prizeModel]; if (self.luckyprizeTimer == nil) { [self startHandleBigPrizeGiftTimer]; } } } - (void)startHandleBigPrizeGiftTimer { NSTimeInterval period = 1.0; //设置时间间隔 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //每秒执行 @kWeakify(self); dispatch_source_set_event_handler(_timer, ^{ @kStrongify(self) if (self.bigPrizeGiftQueue.count > 0) { dispatch_sync(dispatch_get_main_queue(), ^{ XPGiftBigPrizeModel * prizeModel = [self.bigPrizeGiftQueue firstObject]; [self createBigPrizeAnimation:prizeModel]; [self.bigPrizeGiftQueue removeObject:prizeModel]; }); }else { dispatch_source_cancel(_timer); self.luckyprizeTimer = nil; } }); dispatch_resume(_timer); self.luckyprizeTimer = _timer; } - (void)createBigPrizeAnimation:(XPGiftBigPrizeModel *)prizeModel { NSAttributedString *text = [self createBigPrizeAttribute:prizeModel]; UIImageView *luckyBgView = [[UIImageView alloc] initWithFrame:CGRectMake(KScreenWidth, kNavigationHeight + 15, KScreenWidth, 45)]; luckyBgView.contentMode = UIViewContentModeScaleAspectFill; luckyBgView.image= [UIImage imageNamed:@"room_lucky_gift_big_prize_bg"]; UILabel *contentLabel = [[UILabel alloc] initWithFrame:CGRectMake(90, 0, KScreenWidth - 160, 45)]; contentLabel.attributedText = text; contentLabel.textAlignment = NSTextAlignmentCenter; contentLabel.numberOfLines = 2; [luckyBgView addSubview:contentLabel]; [self.superview addSubview:luckyBgView]; [UIView animateWithDuration:0.5 animations:^{ luckyBgView.frame = CGRectMake(0, kNavigationHeight + 15, KScreenWidth, 45); } completion:^(BOOL finished) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [UIView animateWithDuration:0.5 animations:^{ luckyBgView.hidden = YES; } completion:^(BOOL finished) { [luckyBgView removeFromSuperview]; }]; }); }]; } - (NSAttributedString *)createBigPrizeAttribute:(XPGiftBigPrizeModel *)prizModel { NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; [attributedString appendAttributedString: [self createTextAttribute:@"哇偶 ! " color:[ThemeColor messageViewTipColor] font:12]]; [attributedString appendAttributedString: [self createTextAttribute:prizModel.nick color:[ThemeColor messageNickColor] font:12]]; [attributedString appendAttributedString: [self createTextAttribute:@"通过" color:[ThemeColor messageViewTipColor] font:12]]; [attributedString appendAttributedString: [self createTextAttribute:prizModel.luckyBagName color:[ThemeColor messageNickColor] font:12]]; [attributedString appendAttributedString: [self createTextAttribute:@"开出了" color:[ThemeColor messageNickColor] font:12]]; [attributedString appendAttributedString: [self createTextAttribute:prizModel.giftName color:[ThemeColor messageNickColor] font:12]]; return attributedString; } /// 生成一个富文本 /// @param text 富文本的文字 /// @param color 文字的颜色 /// @param font 文字的大小 - (NSMutableAttributedString *)createTextAttribute:(NSString *)text color:(UIColor *)color font:(CGFloat)font { if (text == nil || text.length <= 0) { text = @""; } NSDictionary * dic = @{NSFontAttributeName:[UIFont systemFontOfSize:12], NSForegroundColorAttributeName:color}; NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:text attributes:dic]; return attribute; } #pragma mark - 普通礼物 ///收到了礼物 - (void)receiveGift:(GiftReceiveInfoModel *)receiveInfo { ///CPU警告的时候 需要停止接收动画 ///TODO: RoomInfoModel * roomInfor = [self.delegate getRoomInfo]; if (receiveInfo.isLuckyBagGift) { //如果是福袋礼物的话 就不用看他的价值了 只要有SVGA的话 就播放 if (receiveInfo.displayGift.count > 0) { [receiveInfo.displayGift enumerateObjectsUsingBlock:^(GiftInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.hasVggPic && roomInfor.hasAnimationEffect) { [self.giftEffectQueue addObject:obj]; } }]; if (!self.isGiftEffectPlaying && self.giftEffectQueue.count > 0) { GiftInfoModel * displayInfo = [self.giftEffectQueue firstObject]; [self playGiftEffect:displayInfo]; } } } else { GiftInfoModel *giftInfo = receiveInfo.gift == nil ? receiveInfo.gift : receiveInfo.giftInfo; if (!giftInfo) { giftInfo = [[XPGiftStorage shareStorage] findGiftInfo: receiveInfo.giftId]; } if (giftInfo.hasVggPic && roomInfor.hasAnimationEffect) { [self.giftEffectQueue addObject:giftInfo]; if (!self.isGiftEffectPlaying && self.giftEffectQueue.count > 0) { GiftInfoModel * displayInfo = [self.giftEffectQueue firstObject]; [self playGiftEffect:displayInfo]; } } if (receiveInfo.targetUsers.count > 0 && receiveInfo.targetUids.count <= 0) { receiveInfo.targetUids = [receiveInfo.targetUsers valueForKeyPath:@"uid"]; } NSInteger giftTotal = 0; if (receiveInfo.targetUids.count > 0) { giftTotal = receiveInfo.giftNum * giftInfo.goldPrice * receiveInfo.targetUids.count; } else { giftTotal = receiveInfo.giftNum * giftInfo.goldPrice; } // if (giftTotal >= 520) { // if (self.giftBannerQueue.count == 0 || self.isAnimating == NO) { // [self _creatSpringView:giftReceiveInfo];//创建特效动画 // [self.giftBannerQueue addObject:receiveInfo]; // } else { // [self.giftBannerQueue addObject:receiveInfo]; // } // } } } ///播放礼物特效 - (void)playGiftEffect:(GiftInfoModel *)giftInfo { self.isGiftEffectPlaying = YES; self.giftEffectView.hidden = NO; if (self.giftEffectView.superview == nil) { [self.superview addSubview:self.giftEffectView]; [self.giftEffectView mas_makeConstraints:^(MASConstraintMaker *make) { make.center.mas_equalTo(self.superview); make.width.mas_equalTo(KScreenWidth); make.height.mas_equalTo(KScreenHeight); }]; } [self.superview bringSubviewToFront:self.giftEffectView]; [self.parser parseWithURL:[NSURL URLWithString:giftInfo.vggUrl] completionBlock:^(SVGAVideoEntity * _Nullable videoItem) { if (videoItem != nil) { CGFloat width = videoItem.videoSize.width; CGFloat height = videoItem.videoSize.height; if (width > height) { self.giftEffectView.contentMode = UIViewContentModeScaleAspectFit; } else {//高大于宽 CGFloat resizeH = KScreenWidth * height / width;//按照屏幕的宽度去缩放,获得高度 if (resizeH > KScreenHeight) {//如果大于屏幕高度,填充 self.giftEffectView.contentMode = UIViewContentModeScaleAspectFill; } else {//小于屏幕高度, self.giftEffectView.contentMode = UIViewContentModeScaleAspectFit; } } self.giftEffectView.alpha = 1; self.giftEffectView.loops = 1; self.giftEffectView.clearsAfterStop = YES; self.giftEffectView.videoItem = videoItem; [self.giftEffectView startAnimation]; } } failureBlock:^(NSError * _Nullable error) { }]; [self.giftEffectQueue removeObject:giftInfo]; } #pragma mark - SVGAPlayerDelegate - (void)svgaPlayerDidFinishedAnimation:(SVGAPlayer *)player { if (player == self.giftEffectView) { self.giftEffectView.hidden = YES; self.isGiftEffectPlaying = NO; if (self.giftEffectQueue.count > 0) { GiftInfoModel * infor = [self.giftEffectQueue firstObject]; [self playGiftEffect:infor]; } } } #pragma mark - Getters And Setters - (UIImageView *)backImageView { if (!_backImageView) { _backImageView = [[UIImageView alloc] init]; _backImageView.userInteractionEnabled = YES; _backImageView.image = [UIImage imageNamed:@"room_background"]; _backImageView.layer.masksToBounds = YES; _backImageView.contentMode = UIViewContentModeScaleAspectFill; } return _backImageView; } - (SVGAImageView *)giftEffectView { if (!_giftEffectView) { _giftEffectView = [[SVGAImageView alloc]init]; _giftEffectView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5]; _giftEffectView.userInteractionEnabled = NO; _giftEffectView.delegate = self; _giftEffectView.hidden = YES; } return _giftEffectView; } - (SVGAParser *)parser { if (!_parser) { _parser = [[SVGAParser alloc]init]; } return _parser; } - (NSMutableArray *)giftEffectQueue { if (!_giftEffectQueue) { _giftEffectQueue = [NSMutableArray array]; } return _giftEffectQueue; } - (NSMutableArray *)bigPrizeGiftQueue { if (!_bigPrizeGiftQueue) { _bigPrizeGiftQueue = [NSMutableArray array]; } return _bigPrizeGiftQueue; } - (NSMutableArray *)giftBannerQueue { if (!_giftBannerQueue) { _giftBannerQueue = [NSMutableArray array]; } return _giftBannerQueue; } @end