From 18f57d502edb11ddd4f6548161508f16e27b514e Mon Sep 17 00:00:00 2001 From: fengshuo <963787902@qq.com> Date: Thu, 18 Nov 2021 15:34:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=BF=E9=97=B4=E9=80=81=E7=A4=BC=E7=89=A9?= =?UTF-8?q?=E7=89=B9=E6=95=88=20=E7=A6=8F=E8=A2=8B=E9=A3=98=E5=B1=8F?= =?UTF-8?q?=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Podfile | 1 + Podfile.lock | 19 +- xplan-ios.xcodeproj/project.pbxproj | 12 + .../Contents.json | 22 ++ .../room_lucky_gift_big_prize_bg@2x.png | Bin 0 -> 15171 bytes .../room_lucky_gift_big_prize_bg@3x.png | Bin 0 -> 24051 bytes xplan-ios/Main/IM/Model/AttachmentModel.h | 16 +- .../SendGiftView/Model/GiftReceiveInfoModel.h | 2 + .../Main/Room/Model/XPGiftBigPrizeModel.h | 21 ++ .../Main/Room/Model/XPGiftBigPrizeModel.m | 12 + .../XPRoomBackContainerView.h | 4 +- .../XPRoomBackContainerView.m | 316 +++++++++++++++++- .../XPRoomGiftBannerView.h | 16 + .../XPRoomGiftBannerView.m | 51 +++ xplan-ios/Main/Room/View/ThemeColor+Room.h | 2 + xplan-ios/Main/Room/View/ThemeColor+Room.m | 5 + .../Main/Room/View/XPRoomViewController.m | 4 +- 17 files changed, 493 insertions(+), 10 deletions(-) create mode 100644 xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/room_lucky_gift_big_prize_bg@2x.png create mode 100644 xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/room_lucky_gift_big_prize_bg@3x.png create mode 100644 xplan-ios/Main/Room/Model/XPGiftBigPrizeModel.h create mode 100644 xplan-ios/Main/Room/Model/XPGiftBigPrizeModel.m create mode 100644 xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomGiftBannerView.h create mode 100644 xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomGiftBannerView.m diff --git a/Podfile b/Podfile index b89d77b4..49975533 100644 --- a/Podfile +++ b/Podfile @@ -45,6 +45,7 @@ target 'xplan-ios' do pod 'mob_sharesdk/ShareSDKPlatforms/WeChat' pod 'mob_sharesdk/ShareSDKPlatforms/Apple' pod 'mob_sharesdk/ShareSDKExtension' + pod 'SVGAPlayer', '~> 2.3' #调试 pod 'LookinServer', :configurations => ['Debug'] diff --git a/Podfile.lock b/Podfile.lock index 2dacd8c9..29944836 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -46,6 +46,7 @@ PODS: - NIMSDK_LITE (7.8.5) - NTESQuickPass (2.1.9) - pop (1.0.12) + - Protobuf (3.19.1) - Qiniu (8.3.2): - HappyDNS (~> 0.3.17) - ReactiveObjC (3.1.1) @@ -55,6 +56,15 @@ PODS: - SDWebImage/Core (= 5.11.1) - SDWebImage/Core (5.11.1) - SSKeychain (1.4.1) + - SSZipArchive (2.4.2) + - SVGAPlayer (2.5.7): + - SVGAPlayer/Core (= 2.5.7) + - SVGAPlayer/ProtoFiles (= 2.5.7) + - SVGAPlayer/Core (2.5.7): + - SSZipArchive (>= 1.8.1) + - SVGAPlayer/ProtoFiles + - SVGAPlayer/ProtoFiles (2.5.7): + - Protobuf (~> 3.4) - SZTextView (1.3.0) - YYText (1.0.7) @@ -83,6 +93,7 @@ DEPENDENCIES: - SDCycleScrollView - SDWebImage - SSKeychain + - SVGAPlayer (~> 2.3) - SZTextView - YYText @@ -105,11 +116,14 @@ SPEC REPOS: - NIMSDK_LITE - NTESQuickPass - pop + - Protobuf - Qiniu - ReactiveObjC - SDCycleScrollView - SDWebImage - SSKeychain + - SSZipArchive + - SVGAPlayer - SZTextView - YYText @@ -131,14 +145,17 @@ SPEC CHECKSUMS: NIMSDK_LITE: 8e28ae0a26dd1dccc4684b697381f0a72a733f51 NTESQuickPass: 8431dc52737c95883cd382c2ee75664d58f39377 pop: d582054913807fd11fd50bfe6a539d91c7e1a55a + Protobuf: 3724efa50cb2846d7ccebc8691c574e85fd74471 Qiniu: 61f1e2fdfb35b37f98c8f03a718faf12652f9994 ReactiveObjC: 011caa393aa0383245f2dcf9bf02e86b80b36040 SDCycleScrollView: a0d74c3384caa72bdfc81470bdbc8c14b3e1fbcf SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d SSKeychain: 55cc80f66f5c73da827e3077f02e43528897db41 + SSZipArchive: e7b4f3d9e780c2acc1764cd88fbf2de28f26e5b2 + SVGAPlayer: 318b85a78b61292d6ae9dfcd651f3f0d1cdadd86 SZTextView: 094dc6acc9beec537685c545d6e3e0d4975174e1 YYText: 5c461d709e24d55a182d1441c41dc639a18a4849 -PODFILE CHECKSUM: c67a976c4f7626b406093a8fb7efe4601ebeda8a +PODFILE CHECKSUM: e8e216a3e86155b1d25433a4eb105e33395eca92 COCOAPODS: 1.10.1 diff --git a/xplan-ios.xcodeproj/project.pbxproj b/xplan-ios.xcodeproj/project.pbxproj index 2c5bf066..30e35078 100644 --- a/xplan-ios.xcodeproj/project.pbxproj +++ b/xplan-ios.xcodeproj/project.pbxproj @@ -138,6 +138,8 @@ E824546426F5FF1C00BE8163 /* XPMineResetPayPasswordPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E824546326F5FF1C00BE8163 /* XPMineResetPayPasswordPresenter.m */; }; E824546626F5FF6000BE8163 /* XPMineResetPayPasswordProtocol.h in Sources */ = {isa = PBXBuildFile; fileRef = E824546526F5FF5100BE8163 /* XPMineResetPayPasswordProtocol.h */; }; E82EE0F8272FDDFA00D15DC1 /* UserPrivacyView.m in Sources */ = {isa = PBXBuildFile; fileRef = E82EE0F7272FDDFA00D15DC1 /* UserPrivacyView.m */; }; + E83DB47A27462C4500D8CBD1 /* XPGiftBigPrizeModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E83DB47927462C4500D8CBD1 /* XPGiftBigPrizeModel.m */; }; + E83DB47D2746372300D8CBD1 /* XPRoomGiftBannerView.m in Sources */ = {isa = PBXBuildFile; fileRef = E83DB47C2746372300D8CBD1 /* XPRoomGiftBannerView.m */; }; E84B0E3F2727EDF6008818C6 /* XPRoomMessageTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E84B0E3E2727EDF6008818C6 /* XPRoomMessageTableViewCell.m */; }; E84B0E422727EE0A008818C6 /* XPRoomMessageHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = E84B0E412727EE0A008818C6 /* XPRoomMessageHeaderView.m */; }; E84B0E462727EF9D008818C6 /* XPRoomMessageParser.m in Sources */ = {isa = PBXBuildFile; fileRef = E84B0E452727EF9D008818C6 /* XPRoomMessageParser.m */; }; @@ -515,6 +517,10 @@ E824546526F5FF5100BE8163 /* XPMineResetPayPasswordProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPMineResetPayPasswordProtocol.h; sourceTree = ""; }; E82EE0F6272FDDFA00D15DC1 /* UserPrivacyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserPrivacyView.h; sourceTree = ""; }; E82EE0F7272FDDFA00D15DC1 /* UserPrivacyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserPrivacyView.m; sourceTree = ""; }; + E83DB47827462C4500D8CBD1 /* XPGiftBigPrizeModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPGiftBigPrizeModel.h; sourceTree = ""; }; + E83DB47927462C4500D8CBD1 /* XPGiftBigPrizeModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPGiftBigPrizeModel.m; sourceTree = ""; }; + E83DB47B2746372300D8CBD1 /* XPRoomGiftBannerView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPRoomGiftBannerView.h; sourceTree = ""; }; + E83DB47C2746372300D8CBD1 /* XPRoomGiftBannerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPRoomGiftBannerView.m; sourceTree = ""; }; E84B0E3D2727EDF6008818C6 /* XPRoomMessageTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPRoomMessageTableViewCell.h; sourceTree = ""; }; E84B0E3E2727EDF6008818C6 /* XPRoomMessageTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPRoomMessageTableViewCell.m; sourceTree = ""; }; E84B0E402727EE0A008818C6 /* XPRoomMessageHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPRoomMessageHeaderView.h; sourceTree = ""; }; @@ -1315,6 +1321,8 @@ E804875F2717DD70008595F2 /* Model */ = { isa = PBXGroup; children = ( + E83DB47827462C4500D8CBD1 /* XPGiftBigPrizeModel.h */, + E83DB47927462C4500D8CBD1 /* XPGiftBigPrizeModel.m */, E89D60BF271D64B9001F8895 /* RoomInfoModel.h */, E89D60C0271D64B9001F8895 /* RoomInfoModel.m */, ); @@ -1776,6 +1784,8 @@ children = ( E8AEAEEB27141AE20017FCE0 /* XPRoomBackContainerView.h */, E8AEAEEC27141AE20017FCE0 /* XPRoomBackContainerView.m */, + E83DB47B2746372300D8CBD1 /* XPRoomGiftBannerView.h */, + E83DB47C2746372300D8CBD1 /* XPRoomGiftBannerView.m */, ); path = BaseUIContainerView; sourceTree = ""; @@ -2227,6 +2237,7 @@ E8AC723226F49710007D6E91 /* XPMineNotificationTableViewCell.m in Sources */, E8AC722926F488DA007D6E91 /* XPMineFeedbackProtocol.h in Sources */, E8AC721E26F472BF007D6E91 /* XPMineSettingProtocol.h in Sources */, + E83DB47A27462C4500D8CBD1 /* XPGiftBigPrizeModel.m in Sources */, E81366F826F0C12A0076364C /* LoginFullInfoProtocol.h in Sources */, E8E70D7E26F2F19D00F03460 /* Api+Mine.m in Sources */, E824543D26F58C3A00BE8163 /* XPLoginBindSuccessView.m in Sources */, @@ -2374,6 +2385,7 @@ 187EEEF026E89FE8002833B2 /* AccountInfoStorage.m in Sources */, 186A536B26FC6F2E00D67B2C /* XCShareItemCell.m in Sources */, E8B846C526FDB41A00A777FE /* XPMineUserInfolbumPresenter.m in Sources */, + E83DB47D2746372300D8CBD1 /* XPRoomGiftBannerView.m in Sources */, E872309326E8D31500B90D4F /* LoginVerifCodeView.m in Sources */, 186A534626FC6ED900D67B2C /* TTPopup.m in Sources */, E81C278C26EAFAF60031E639 /* Base64.m in Sources */, diff --git a/xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/Contents.json b/xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/Contents.json new file mode 100644 index 00000000..82027caf --- /dev/null +++ b/xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "room_lucky_gift_big_prize_bg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "room_lucky_gift_big_prize_bg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/room_lucky_gift_big_prize_bg@2x.png b/xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/room_lucky_gift_big_prize_bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2776437fc902f5607795ea3fad0bfa220ec92f GIT binary patch literal 15171 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 a7%IAR#-%6v43_i14s~U1rSdlx-~SITWrJn_ literal 0 HcmV?d00001 diff --git a/xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/room_lucky_gift_big_prize_bg@3x.png b/xplan-ios/Assets.xcassets/Room/room_lucky_gift_big_prize_bg.imageset/room_lucky_gift_big_prize_bg@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b14578a8c88c53c24c2b63dd804ae6de63d0ccbb GIT binary patch literal 24051 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 @property (nonatomic,assign) int first; diff --git a/xplan-ios/Main/ModuleKit/SendGiftView/Model/GiftReceiveInfoModel.h b/xplan-ios/Main/ModuleKit/SendGiftView/Model/GiftReceiveInfoModel.h index 847176f5..6b9e1576 100644 --- a/xplan-ios/Main/ModuleKit/SendGiftView/Model/GiftReceiveInfoModel.h +++ b/xplan-ios/Main/ModuleKit/SendGiftView/Model/GiftReceiveInfoModel.h @@ -107,6 +107,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic,assign) GiftSourceType sourceType; ///房间送礼物的类型 @property (nonatomic,assign) RoomSendGiftType roomSendGiftType; +///是否是背包礼物 +@property (nonatomic,assign) BOOL isLuckyBagGift; @end NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Room/Model/XPGiftBigPrizeModel.h b/xplan-ios/Main/Room/Model/XPGiftBigPrizeModel.h new file mode 100644 index 00000000..015c853c --- /dev/null +++ b/xplan-ios/Main/Room/Model/XPGiftBigPrizeModel.h @@ -0,0 +1,21 @@ +// +// XPGiftBigPrizeModel.h +// xplan-ios +// +// Created by 冯硕 on 2021/11/18. +// +///四级礼物的模型 +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XPGiftBigPrizeModel : NSObject +///送礼物的人 +@property(nonatomic, copy)NSString *nick; +///礼物的名称 +@property(nonatomic, copy)NSString *giftName; +///幸运的礼物 +@property (nonatomic,copy) NSString *luckyBagName; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Room/Model/XPGiftBigPrizeModel.m b/xplan-ios/Main/Room/Model/XPGiftBigPrizeModel.m new file mode 100644 index 00000000..b8e9b816 --- /dev/null +++ b/xplan-ios/Main/Room/Model/XPGiftBigPrizeModel.m @@ -0,0 +1,12 @@ +// +// XPGiftBigPrizeModel.m +// xplan-ios +// +// Created by 冯硕 on 2021/11/18. +// + +#import "XPGiftBigPrizeModel.h" + +@implementation XPGiftBigPrizeModel + +@end diff --git a/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomBackContainerView.h b/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomBackContainerView.h index 77f43bfb..a3e9d76d 100644 --- a/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomBackContainerView.h +++ b/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomBackContainerView.h @@ -6,11 +6,11 @@ // #import - +#import "RoomHostDelegate.h" NS_ASSUME_NONNULL_BEGIN @interface XPRoomBackContainerView : UIView - +- (instancetype)initWithdelegate:(id)delegate; @end NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomBackContainerView.m b/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomBackContainerView.m index 5316ec91..57fdd682 100644 --- a/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomBackContainerView.m +++ b/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomBackContainerView.m @@ -8,17 +8,50 @@ #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 () + +@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)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; +- (instancetype)initWithdelegate:(id)delegate { + self = [super init]; if (self) { + [[NIMSDK sharedSDK].chatManager addDelegate:self]; + self.delegate = delegate; [self initSubViews]; [self initSubViewConstraints]; } @@ -35,6 +68,244 @@ 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 { @@ -48,4 +319,43 @@ 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 diff --git a/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomGiftBannerView.h b/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomGiftBannerView.h new file mode 100644 index 00000000..268ea3e8 --- /dev/null +++ b/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomGiftBannerView.h @@ -0,0 +1,16 @@ +// +// XPRoomGiftBannerView.h +// xplan-ios +// +// Created by 冯硕 on 2021/11/18. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface XPRoomGiftBannerView : UIView + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomGiftBannerView.m b/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomGiftBannerView.m new file mode 100644 index 00000000..655e2044 --- /dev/null +++ b/xplan-ios/Main/Room/View/BaseUIContainerView/XPRoomGiftBannerView.m @@ -0,0 +1,51 @@ +// +// XPRoomGiftBannerView.m +// xplan-ios +// +// Created by 冯硕 on 2021/11/18. +// + +#import "XPRoomGiftBannerView.h" + +@interface XPRoomAvatarNickView : UIView +/// +@property (nonatomic,strong) UIImageView *avatImageView; +/// +@property (nonatomic,strong) UILabel *nickLabel; +@end + +@implementation XPRoomAvatarNickView + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + +} + +- (void)initSubViewConstraints { + +} + + + +@end + + + +@interface XPRoomGiftBannerView () +/// +@property (nonatomic,strong) UIImageView *backImageView; + +@end + + +@implementation XPRoomGiftBannerView + + +@end diff --git a/xplan-ios/Main/Room/View/ThemeColor+Room.h b/xplan-ios/Main/Room/View/ThemeColor+Room.h index 79b9fb32..64229a97 100644 --- a/xplan-ios/Main/Room/View/ThemeColor+Room.h +++ b/xplan-ios/Main/Room/View/ThemeColor+Room.h @@ -27,6 +27,8 @@ NS_ASSUME_NONNULL_BEGIN + (UIColor *)messageNickColor; ///默认的文字的颜色 + (UIColor *)messageDefaultTextColor; +///获取公屏提示 颜色 #FFFFFE 0.5 ++ (UIColor *)messageViewTipColor; // ------公屏相关颜色 END------ / @end diff --git a/xplan-ios/Main/Room/View/ThemeColor+Room.m b/xplan-ios/Main/Room/View/ThemeColor+Room.m index a4141cde..38556281 100644 --- a/xplan-ios/Main/Room/View/ThemeColor+Room.m +++ b/xplan-ios/Main/Room/View/ThemeColor+Room.m @@ -48,6 +48,11 @@ return [UIColor colorWithWhite:1 alpha:0.5]; } +///获取公屏提示 颜色 #FFFFFE 0.5 ++ (UIColor *)messageViewTipColor{ + return UIColorRGBAlpha(0xfffffe, 0.5); +} + // ------公屏相关颜色 END------ / @end diff --git a/xplan-ios/Main/Room/View/XPRoomViewController.m b/xplan-ios/Main/Room/View/XPRoomViewController.m index 86d4be64..b95d0c7b 100644 --- a/xplan-ios/Main/Room/View/XPRoomViewController.m +++ b/xplan-ios/Main/Room/View/XPRoomViewController.m @@ -191,7 +191,7 @@ } - (void)onMicroQueueUpdate:(NSMutableDictionary *)queue { - [self.menuContainerView onMicroQueueUpdate:queue]; + } - (void)exitRoom { @@ -203,7 +203,7 @@ - (XPRoomBackContainerView *)backContainerView { if (!_backContainerView) { - _backContainerView = [[XPRoomBackContainerView alloc] init]; + _backContainerView = [[XPRoomBackContainerView alloc] initWithdelegate:self]; } return _backContainerView; }