From 2b5a1eb2a5e6535b4539fd66a83d88ca12e4ca93 Mon Sep 17 00:00:00 2001 From: liyuhua <15626451870@163.com> Date: Sat, 23 Mar 2024 16:28:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A4=BC=E7=89=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Podfile | 2 + yinmeng-ios.xcodeproj/project.pbxproj | 110 +++++++- .../Assets.xcassets/room/Gift/Contents.json | 6 + .../room_gift_slect_bg.imageset/Contents.json | 22 ++ .../room_gift_slect_bg@2x.png | Bin 0 -> 643 bytes .../room_gift_slect_bg@3x.png | Bin 0 -> 997 bytes .../Contents.json | 22 ++ .../yin_room_gift_arrow@2x.png | Bin 0 -> 181 bytes .../yin_room_gift_arrow@3x.png | Bin 0 -> 254 bytes .../Contents.json | 22 ++ .../yin_room_gift_diamond@2x.png | Bin 0 -> 1711 bytes .../yin_room_gift_diamond@3x.png | Bin 0 -> 2582 bytes .../Contents.json | 22 ++ .../yin_room_gift_select@2x.png | Bin 0 -> 643 bytes .../yin_room_gift_select@3x.png | Bin 0 -> 997 bytes .../Contents.json | 22 ++ .../yin_room_gift_tag_dedicated@2x.png | Bin 0 -> 666 bytes .../yin_room_gift_tag_dedicated@3x.png | Bin 0 -> 1118 bytes .../Contents.json | 22 ++ .../yin_room_gift_tag_effect@2x.png | Bin 0 -> 748 bytes .../yin_room_gift_tag_effect@3x.png | Bin 0 -> 1138 bytes .../Contents.json | 22 ++ .../yin_room_gift_tag_latest@2x.png | Bin 0 -> 1075 bytes .../yin_room_gift_tag_latest@3x.png | Bin 0 -> 1712 bytes .../Contents.json | 22 ++ .../yin_room_gift_tag_limit@2x.png | Bin 0 -> 1170 bytes .../yin_room_gift_tag_limit@3x.png | Bin 0 -> 1758 bytes .../Contents.json | 22 ++ .../yin_room_gift_up_arrow@2x.png | Bin 0 -> 222 bytes .../yin_room_gift_up_arrow@3x.png | Bin 0 -> 292 bytes .../YYTextAsyncLayer+YinTextAsyncLayer.h | 16 ++ .../YYTextAsyncLayer+YinTextAsyncLayer.m | 27 ++ .../Security/yinmeng-ios-Bridging-Header.h | 3 + .../Extension/UIButton/UIButton+.swift | 17 +- .../Chat/Model/ChatCustomMsgModel.swift | 23 ++ .../Chat/Model/ChatMsgRemoteModel.swift | 16 ++ .../Modules/Home/HomeVoiceUserInfoView.swift | 11 +- .../Modules/Home/PlayVoiceManager.swift | 47 +++- .../Room/Tool/YinRoomAudioManager.swift | 15 +- .../Room/Tool/YinRoomTRTCManager.swift | 3 +- yinmeng-ios/Modules/Room/VC/RoomVC.swift | 138 +++++++--- .../NormalMicSeatSuperView.swift | 25 +- .../Model/RoomMsgListModel.swift | 2 + .../View/RoomChatScreenContentCell.swift | 71 +++++ .../View/RoomChatScreenUserChatCell.swift | 4 +- .../View/RoomChatScreenView.swift | 153 +++++++---- .../ViewModel/RoomChatScreenManager.swift | 92 +++++++ .../View/RoomDynamicEffectView.swift | 169 ++++++++++++ .../View/RoomMenuView/View/RoomMenuView.swift | 24 +- .../RoomMenuView/View/RoomSendTextView.swift | 59 ++++- .../View/YinRoomRankItemView.swift | 2 +- .../SendGift/Model/RectiveGiftModel.swift | 40 +++ .../SendGift/Model/RectiveGiftUserModel.swift | 18 ++ .../View/SendGift/Model/SendGiftModel.swift | 50 ++++ .../SendGift/Model/SendGiftSendNumModel.swift | 22 ++ .../SendGift/Model/SendGiftUserModel.swift | 5 +- .../View/SendGift/View/SendGiftCell.swift | 153 +++++++++++ .../SendGift/View/SendGiftFaceplateView.swift | 46 ---- .../SendGift/View/SendGiftSendNumCell.swift | 80 ++++++ .../SendGift/View/SendGiftSendNumView.swift | 98 +++++++ .../View/SendGift/View/SendGiftSendView.swift | 204 +++++++++++++++ .../View/SendGift/View/SendGiftTopView.swift | 3 + .../View/SendGift/View/SendGiftUserCell.swift | 5 + .../View/SendGift/View/SendGiftUserView.swift | 95 ++++++- .../Room/View/SendGift/View/SendGiftVC.swift | 245 ++++++++++++++++++ .../View/SendGift/View/SendGiftView.swift | 91 +++++++ 66 files changed, 2214 insertions(+), 174 deletions(-) create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/room_gift_slect_bg.imageset/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/room_gift_slect_bg.imageset/room_gift_slect_bg@2x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/room_gift_slect_bg.imageset/room_gift_slect_bg@3x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_arrow.imageset/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_arrow.imageset/yin_room_gift_arrow@2x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_arrow.imageset/yin_room_gift_arrow@3x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/yin_room_gift_diamond@2x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/yin_room_gift_diamond@3x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_select.imageset/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_select.imageset/yin_room_gift_select@2x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_select.imageset/yin_room_gift_select@3x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_dedicated.imageset/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_dedicated.imageset/yin_room_gift_tag_dedicated@2x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_dedicated.imageset/yin_room_gift_tag_dedicated@3x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_effect.imageset/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_effect.imageset/yin_room_gift_tag_effect@2x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_effect.imageset/yin_room_gift_tag_effect@3x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_latest.imageset/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_latest.imageset/yin_room_gift_tag_latest@2x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_latest.imageset/yin_room_gift_tag_latest@3x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_limit.imageset/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_limit.imageset/yin_room_gift_tag_limit@2x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_limit.imageset/yin_room_gift_tag_limit@3x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_up_arrow.imageset/Contents.json create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_up_arrow.imageset/yin_room_gift_up_arrow@2x.png create mode 100644 yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_up_arrow.imageset/yin_room_gift_up_arrow@3x.png create mode 100644 yinmeng-ios/Base/Security/YYTextAsyncLayer+YinTextAsyncLayer.h create mode 100644 yinmeng-ios/Base/Security/YYTextAsyncLayer+YinTextAsyncLayer.m create mode 100644 yinmeng-ios/Modules/Chat/Model/ChatCustomMsgModel.swift create mode 100644 yinmeng-ios/Modules/Chat/Model/ChatMsgRemoteModel.swift create mode 100644 yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenContentCell.swift create mode 100644 yinmeng-ios/Modules/Room/View/RoomChatScreenView/ViewModel/RoomChatScreenManager.swift create mode 100644 yinmeng-ios/Modules/Room/View/RoomDynamicEffectView/View/RoomDynamicEffectView.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/Model/RectiveGiftModel.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/Model/RectiveGiftUserModel.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftModel.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftSendNumModel.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftCell.swift delete mode 100644 yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftFaceplateView.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendNumCell.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendNumView.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendView.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftVC.swift create mode 100644 yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftView.swift diff --git a/Podfile b/Podfile index fcd0f6c..dc59746 100644 --- a/Podfile +++ b/Podfile @@ -10,6 +10,7 @@ target 'yinmeng-ios' do pod 'Moya' pod 'MBProgressHUD' pod 'SVGAPlayer' + pod 'YYText' # 滑动标签栏 pod 'JXCategoryView' pod 'JXPagingView/Pager' @@ -35,6 +36,7 @@ target 'yinmeng-ios' do pod 'FFPopup' pod 'TXLiteAVSDK_TRTC', '~> 11.4.14530' pod 'MJExtension' + pod 'QGVAPlayer' #声网 pod 'AgoraRtcEngine_iOS', '~> 4.2.2' # Pods for yinmeng-ios diff --git a/yinmeng-ios.xcodeproj/project.pbxproj b/yinmeng-ios.xcodeproj/project.pbxproj index 524dac6..beff110 100644 --- a/yinmeng-ios.xcodeproj/project.pbxproj +++ b/yinmeng-ios.xcodeproj/project.pbxproj @@ -70,7 +70,23 @@ 23630BBD2BAD379C003AD25D /* YinRoomAudioManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BBC2BAD379C003AD25D /* YinRoomAudioManager.swift */; }; 23630BBF2BAD37B7003AD25D /* YinRoomTRTCManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BBE2BAD37B7003AD25D /* YinRoomTRTCManager.swift */; }; 23630BC12BAD5537003AD25D /* YinRoomAgoraManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BC02BAD5537003AD25D /* YinRoomAgoraManager.swift */; }; + 23630BC32BAD7868003AD25D /* SendGiftVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BC22BAD7868003AD25D /* SendGiftVC.swift */; }; + 23630BC72BAD7A94003AD25D /* SendGiftView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BC62BAD7A94003AD25D /* SendGiftView.swift */; }; + 23630BC92BAD7BCB003AD25D /* SendGiftCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BC82BAD7BCB003AD25D /* SendGiftCell.swift */; }; + 23630BCB2BAD84B0003AD25D /* SendGiftModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BCA2BAD84B0003AD25D /* SendGiftModel.swift */; }; + 23630BCD2BAD908D003AD25D /* SendGiftSendView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BCC2BAD908D003AD25D /* SendGiftSendView.swift */; }; + 23630BCF2BADA7D9003AD25D /* SendGiftSendNumView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BCE2BADA7D9003AD25D /* SendGiftSendNumView.swift */; }; + 23630BD12BADA900003AD25D /* SendGiftSendNumCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BD02BADA900003AD25D /* SendGiftSendNumCell.swift */; }; + 23630BD32BADA9FF003AD25D /* SendGiftSendNumModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23630BD22BADA9FF003AD25D /* SendGiftSendNumModel.swift */; }; 238A900C2BAAC6C600828123 /* HomeVoiceSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 238A900B2BAAC6C600828123 /* HomeVoiceSearchView.swift */; }; + 239EA6442BAE898300570127 /* RectiveGiftModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6432BAE898300570127 /* RectiveGiftModel.swift */; }; + 239EA6462BAE8A6600570127 /* RectiveGiftUserModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6452BAE8A6600570127 /* RectiveGiftUserModel.swift */; }; + 239EA6482BAE8D5E00570127 /* ChatCustomMsgModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6472BAE8D5E00570127 /* ChatCustomMsgModel.swift */; }; + 239EA64C2BAE90B700570127 /* ChatMsgRemoteModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA64B2BAE90B700570127 /* ChatMsgRemoteModel.swift */; }; + 239EA64E2BAE949200570127 /* RoomChatScreenManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA64D2BAE949200570127 /* RoomChatScreenManager.swift */; }; + 239EA6512BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6502BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m */; }; + 239EA6532BAEA73100570127 /* RoomChatScreenContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6522BAEA73100570127 /* RoomChatScreenContentCell.swift */; }; + 239EA65A2BAEB48A00570127 /* RoomDynamicEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 239EA6592BAEB48A00570127 /* RoomDynamicEffectView.swift */; }; 23EE96E02B9EB22100475D69 /* RoomMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96DF2B9EB22100475D69 /* RoomMenuView.swift */; }; 23EE96E22B9EB22F00475D69 /* RoomSendTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96E12B9EB22F00475D69 /* RoomSendTextView.swift */; }; 23EE96E62B9EE79A00475D69 /* RoomVCViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96E52B9EE79A00475D69 /* RoomVCViewModel.swift */; }; @@ -81,7 +97,6 @@ 23EE96F42BA048F100475D69 /* MicSeatGiftValueModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96F32BA048F100475D69 /* MicSeatGiftValueModel.swift */; }; 23EE96F62BA061DE00475D69 /* RoomMsgListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE96F52BA061DE00475D69 /* RoomMsgListModel.swift */; }; 23EE96FA2BA1A3A300475D69 /* YinSpeak.svga in Resources */ = {isa = PBXBuildFile; fileRef = 23EE96F92BA1A3A200475D69 /* YinSpeak.svga */; }; - 23EE97012BA29B3200475D69 /* SendGiftFaceplateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE97002BA29B3200475D69 /* SendGiftFaceplateView.swift */; }; 23EE97032BA29F1E00475D69 /* SendGiftTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE97022BA29F1E00475D69 /* SendGiftTopView.swift */; }; 23EE97052BA2A67300475D69 /* SendGiftUserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE97042BA2A67300475D69 /* SendGiftUserView.swift */; }; 23EE97072BA2AC8300475D69 /* SendGiftUserCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23EE97062BA2AC8300475D69 /* SendGiftUserCell.swift */; }; @@ -221,7 +236,24 @@ 23630BBC2BAD379C003AD25D /* YinRoomAudioManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinRoomAudioManager.swift; sourceTree = ""; }; 23630BBE2BAD37B7003AD25D /* YinRoomTRTCManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinRoomTRTCManager.swift; sourceTree = ""; }; 23630BC02BAD5537003AD25D /* YinRoomAgoraManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YinRoomAgoraManager.swift; sourceTree = ""; }; + 23630BC22BAD7868003AD25D /* SendGiftVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftVC.swift; sourceTree = ""; }; + 23630BC62BAD7A94003AD25D /* SendGiftView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftView.swift; sourceTree = ""; }; + 23630BC82BAD7BCB003AD25D /* SendGiftCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftCell.swift; sourceTree = ""; }; + 23630BCA2BAD84B0003AD25D /* SendGiftModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftModel.swift; sourceTree = ""; }; + 23630BCC2BAD908D003AD25D /* SendGiftSendView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftSendView.swift; sourceTree = ""; }; + 23630BCE2BADA7D9003AD25D /* SendGiftSendNumView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftSendNumView.swift; sourceTree = ""; }; + 23630BD02BADA900003AD25D /* SendGiftSendNumCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftSendNumCell.swift; sourceTree = ""; }; + 23630BD22BADA9FF003AD25D /* SendGiftSendNumModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftSendNumModel.swift; sourceTree = ""; }; 238A900B2BAAC6C600828123 /* HomeVoiceSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeVoiceSearchView.swift; sourceTree = ""; }; + 239EA6432BAE898300570127 /* RectiveGiftModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RectiveGiftModel.swift; sourceTree = ""; }; + 239EA6452BAE8A6600570127 /* RectiveGiftUserModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RectiveGiftUserModel.swift; sourceTree = ""; }; + 239EA6472BAE8D5E00570127 /* ChatCustomMsgModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatCustomMsgModel.swift; sourceTree = ""; }; + 239EA64B2BAE90B700570127 /* ChatMsgRemoteModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMsgRemoteModel.swift; sourceTree = ""; }; + 239EA64D2BAE949200570127 /* RoomChatScreenManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChatScreenManager.swift; sourceTree = ""; }; + 239EA64F2BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "YYTextAsyncLayer+YinTextAsyncLayer.h"; sourceTree = ""; }; + 239EA6502BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "YYTextAsyncLayer+YinTextAsyncLayer.m"; sourceTree = ""; }; + 239EA6522BAEA73100570127 /* RoomChatScreenContentCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomChatScreenContentCell.swift; sourceTree = ""; }; + 239EA6592BAEB48A00570127 /* RoomDynamicEffectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomDynamicEffectView.swift; sourceTree = ""; }; 23EE96DF2B9EB22100475D69 /* RoomMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMenuView.swift; sourceTree = ""; }; 23EE96E12B9EB22F00475D69 /* RoomSendTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSendTextView.swift; sourceTree = ""; }; 23EE96E52B9EE79A00475D69 /* RoomVCViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RoomVCViewModel.swift; sourceTree = ""; }; @@ -232,7 +264,6 @@ 23EE96F32BA048F100475D69 /* MicSeatGiftValueModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MicSeatGiftValueModel.swift; sourceTree = ""; }; 23EE96F52BA061DE00475D69 /* RoomMsgListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMsgListModel.swift; sourceTree = ""; }; 23EE96F92BA1A3A200475D69 /* YinSpeak.svga */ = {isa = PBXFileReference; lastKnownFileType = file; path = YinSpeak.svga; sourceTree = ""; }; - 23EE97002BA29B3200475D69 /* SendGiftFaceplateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftFaceplateView.swift; sourceTree = ""; }; 23EE97022BA29F1E00475D69 /* SendGiftTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftTopView.swift; sourceTree = ""; }; 23EE97042BA2A67300475D69 /* SendGiftUserView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftUserView.swift; sourceTree = ""; }; 23EE97062BA2AC8300475D69 /* SendGiftUserCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendGiftUserCell.swift; sourceTree = ""; }; @@ -379,6 +410,7 @@ 234E2DED2B98411800433CF7 /* View */ = { isa = PBXGroup; children = ( + 239EA6542BAEB47900570127 /* RoomDynamicEffectView */, 23EE96FB2BA29AFF00475D69 /* SendGift */, 23EE96DA2B9EB17D00475D69 /* RoomMenuView */, 234E2E2B2B9AFCDB00433CF7 /* RoomChatScreenView */, @@ -573,6 +605,7 @@ 234E2E2C2B9AFCDB00433CF7 /* ViewModel */ = { isa = PBXGroup; children = ( + 239EA64D2BAE949200570127 /* RoomChatScreenManager.swift */, ); path = ViewModel; sourceTree = ""; @@ -591,6 +624,7 @@ 234E2E302B9B001A00433CF7 /* RoomChatScreenView.swift */, 234E2E322B9B019B00433CF7 /* RoomChatScreenHeaderView.swift */, 234E2E342B9B06E800433CF7 /* RoomChatScreenUserChatCell.swift */, + 239EA6522BAEA73100570127 /* RoomChatScreenContentCell.swift */, ); path = View; sourceTree = ""; @@ -620,6 +654,46 @@ path = View; sourceTree = ""; }; + 239EA6542BAEB47900570127 /* RoomDynamicEffectView */ = { + isa = PBXGroup; + children = ( + 239EA6552BAEB47900570127 /* ViewModel */, + 239EA6562BAEB47900570127 /* Model */, + 239EA6572BAEB47900570127 /* View */, + 239EA6582BAEB47900570127 /* Tool */, + ); + path = RoomDynamicEffectView; + sourceTree = ""; + }; + 239EA6552BAEB47900570127 /* ViewModel */ = { + isa = PBXGroup; + children = ( + ); + path = ViewModel; + sourceTree = ""; + }; + 239EA6562BAEB47900570127 /* Model */ = { + isa = PBXGroup; + children = ( + ); + path = Model; + sourceTree = ""; + }; + 239EA6572BAEB47900570127 /* View */ = { + isa = PBXGroup; + children = ( + 239EA6592BAEB48A00570127 /* RoomDynamicEffectView.swift */, + ); + path = View; + sourceTree = ""; + }; + 239EA6582BAEB47900570127 /* Tool */ = { + isa = PBXGroup; + children = ( + ); + path = Tool; + sourceTree = ""; + }; 23EE96DA2B9EB17D00475D69 /* RoomMenuView */ = { isa = PBXGroup; children = ( @@ -683,6 +757,10 @@ isa = PBXGroup; children = ( 23EE970E2BA3006800475D69 /* SendGiftUserModel.swift */, + 23630BCA2BAD84B0003AD25D /* SendGiftModel.swift */, + 23630BD22BADA9FF003AD25D /* SendGiftSendNumModel.swift */, + 239EA6432BAE898300570127 /* RectiveGiftModel.swift */, + 239EA6452BAE8A6600570127 /* RectiveGiftUserModel.swift */, ); path = Model; sourceTree = ""; @@ -690,10 +768,15 @@ 23EE96FE2BA29AFF00475D69 /* View */ = { isa = PBXGroup; children = ( - 23EE97002BA29B3200475D69 /* SendGiftFaceplateView.swift */, + 23630BC22BAD7868003AD25D /* SendGiftVC.swift */, 23EE97022BA29F1E00475D69 /* SendGiftTopView.swift */, 23EE97042BA2A67300475D69 /* SendGiftUserView.swift */, 23EE97062BA2AC8300475D69 /* SendGiftUserCell.swift */, + 23630BC62BAD7A94003AD25D /* SendGiftView.swift */, + 23630BC82BAD7BCB003AD25D /* SendGiftCell.swift */, + 23630BCC2BAD908D003AD25D /* SendGiftSendView.swift */, + 23630BCE2BADA7D9003AD25D /* SendGiftSendNumView.swift */, + 23630BD02BADA900003AD25D /* SendGiftSendNumCell.swift */, ); path = View; sourceTree = ""; @@ -758,6 +841,8 @@ children = ( E8479E402B8DC6BC009AF878 /* ChatBaseObject.swift */, E8479E422B8DD077009AF878 /* ChatUIConfig.swift */, + 239EA6472BAE8D5E00570127 /* ChatCustomMsgModel.swift */, + 239EA64B2BAE90B700570127 /* ChatMsgRemoteModel.swift */, ); path = Model; sourceTree = ""; @@ -1118,6 +1203,8 @@ E81A7BA92B885B1F009E736E /* yinmeng-ios-Bridging-Header.h */, 2311D6C92B91BBF2001C70AB /* RecordVoiceManager.h */, 2311D6CA2B91BBF2001C70AB /* RecordVoiceManager.m */, + 239EA64F2BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.h */, + 239EA6502BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m */, ); path = Security; sourceTree = ""; @@ -1252,14 +1339,15 @@ E8D15A9F2B89AED600369467 /* AuthManager.swift in Sources */, 23630BB02BAD2708003AD25D /* YinRoomRankModel.swift in Sources */, E8479E382B8DC5CD009AF878 /* ChatListVC.swift in Sources */, + 239EA6482BAE8D5E00570127 /* ChatCustomMsgModel.swift in Sources */, E89F19AF2B91C00F0098E797 /* BindMobileVC.swift in Sources */, 23EE970F2BA3006800475D69 /* SendGiftUserModel.swift in Sources */, - 23EE97012BA29B3200475D69 /* SendGiftFaceplateView.swift in Sources */, 234E2DFA2B9851F000433CF7 /* UIButton+.swift in Sources */, E86A43B02B85E11B0084C04D /* BaseNavigationViewController.swift in Sources */, E86A43E82B884C5E0084C04D /* String+.swift in Sources */, 23630BBD2BAD379C003AD25D /* YinRoomAudioManager.swift in Sources */, 2311D6D12B91DDDF001C70AB /* UserPayViewModel.swift in Sources */, + 239EA6532BAEA73100570127 /* RoomChatScreenContentCell.swift in Sources */, 2311D6B12B9062A3001C70AB /* HomeVoiceFollowCell.swift in Sources */, 234E2E312B9B001A00433CF7 /* RoomChatScreenView.swift in Sources */, E8D15AA32B89B03D00369467 /* Deserialized.swift in Sources */, @@ -1272,11 +1360,13 @@ 234E2E1E2B9AB43700433CF7 /* RoomNormalMicSeatView.swift in Sources */, 2311D6AF2B906148001C70AB /* HomeVoiceFollowView.swift in Sources */, 23630B9D2BAC0DEA003AD25D /* HomeSearchRoomVC.swift in Sources */, + 239EA64E2BAE949200570127 /* RoomChatScreenManager.swift in Sources */, E86A43DA2B877A840084C04D /* AppConfigObject.swift in Sources */, 2311D6BC2B909A4F001C70AB /* HomeVoicePublishView.swift in Sources */, 23630BB52BAD2725003AD25D /* YinRoomRankView.swift in Sources */, 2311D6AD2B9058AA001C70AB /* HomeVoiceModel.swift in Sources */, 2311D6AB2B9024A9001C70AB /* HomeVoicePlayMusicItemView.swift in Sources */, + 239EA6442BAE898300570127 /* RectiveGiftModel.swift in Sources */, E8D15AA62B89B0C600369467 /* List+.swift in Sources */, 234E2E042B986D8400433CF7 /* RoomQuitModel.swift in Sources */, 234E2E0A2B98779900433CF7 /* RoomQuitUserInfoEmptyCell.swift in Sources */, @@ -1290,13 +1380,16 @@ 234E2E082B98738D00433CF7 /* RoomQuitUserInfoCell.swift in Sources */, E8E4AAB52B8F8E3A0096D77C /* AuthItmeButton.swift in Sources */, 234E2E112B99B50400433CF7 /* RoomQuitViewModel.swift in Sources */, + 239EA65A2BAEB48A00570127 /* RoomDynamicEffectView.swift in Sources */, E86A43BC2B85FA640084C04D /* AuthForgetVC.swift in Sources */, E86A43C32B8628AF0084C04D /* BaseTabBarViewController.swift in Sources */, 234E2E022B986D7600433CF7 /* RoomQuitView.swift in Sources */, E8479E3B2B8DC5FA009AF878 /* ChatViewModel.swift in Sources */, E8479E412B8DC6BC009AF878 /* ChatBaseObject.swift in Sources */, + 239EA64C2BAE90B700570127 /* ChatMsgRemoteModel.swift in Sources */, E86A43AA2B85DFA90084C04D /* BaseViewController.swift in Sources */, 23EE96E22B9EB22F00475D69 /* RoomSendTextView.swift in Sources */, + 23630BCD2BAD908D003AD25D /* SendGiftSendView.swift in Sources */, 23EE96F62BA061DE00475D69 /* RoomMsgListModel.swift in Sources */, E8E4AB1F2B901BFC0096D77C /* ChatGrowingTextView.swift in Sources */, E884E85F2B6900C500ADE6EE /* AppDelegate.swift in Sources */, @@ -1305,6 +1398,7 @@ E8D15AEA2B8CD77800369467 /* H5Utils.swift in Sources */, E8D15AAA2B8ACC6B00369467 /* YMNetworkFun.swift in Sources */, 234E2E202B9AB44800433CF7 /* MicSeatSuperView.swift in Sources */, + 23630BCF2BADA7D9003AD25D /* SendGiftSendNumView.swift in Sources */, E8D15AB82B8B003C00369467 /* UserInfoVC.swift in Sources */, E86A43B82B85F0B80084C04D /* AuthLaunchVC.swift in Sources */, E8E4AB252B901E400096D77C /* ChatMoreMenuCell.swift in Sources */, @@ -1312,6 +1406,7 @@ E86A43C82B8743EA0084C04D /* AuthFillDataVC.swift in Sources */, 23EE96F42BA048F100475D69 /* MicSeatGiftValueModel.swift in Sources */, E86A43CD2B874C8E0084C04D /* BaseView.swift in Sources */, + 23630BCB2BAD84B0003AD25D /* SendGiftModel.swift in Sources */, E8D15AE82B8CD47100369467 /* WebViewController.swift in Sources */, E89F194B2B919ECB0098E797 /* ChatImageCell.swift in Sources */, 234E2E2A2B9AC07B00433CF7 /* MicSeatGiftValueView.swift in Sources */, @@ -1321,8 +1416,10 @@ 233E515B2B8C849600582F9C /* PlanetStarClickItemView.swift in Sources */, E8FF28B42B90ADBE005D2BE7 /* AppKeys.swift in Sources */, 2311D6A92B8F405F001C70AB /* HomeVoiceChooseTypeView.swift in Sources */, + 239EA6462BAE8A6600570127 /* RectiveGiftUserModel.swift in Sources */, 234E2DF42B9847A700433CF7 /* RoomBackgroundView.swift in Sources */, E89F19B52B91E3A50098E797 /* PasswordSetView.swift in Sources */, + 23630BC32BAD7868003AD25D /* SendGiftVC.swift in Sources */, E89F19492B919EB80098E797 /* ChatVoiceCell.swift in Sources */, 234E2E062B986E2100433CF7 /* Enum.swift in Sources */, 23EE96EC2B9F273A00475D69 /* MicSeatModel.swift in Sources */, @@ -1350,13 +1447,16 @@ E86A43BF2B8620C40084C04D /* Utils.swift in Sources */, E86A43BA2B85F1360084C04D /* AuthLoginVC.swift in Sources */, E8D15ABC2B8B87BA00369467 /* UserViewModel.swift in Sources */, + 239EA6512BAE998E00570127 /* YYTextAsyncLayer+YinTextAsyncLayer.m in Sources */, E8479E432B8DD077009AF878 /* ChatUIConfig.swift in Sources */, + 23630BC92BAD7BCB003AD25D /* SendGiftCell.swift in Sources */, 23EE97032BA29F1E00475D69 /* SendGiftTopView.swift in Sources */, 234E2E252B9AB64700433CF7 /* NormalMicSeatCell.swift in Sources */, E8479E4D2B8DDBC5009AF878 /* ChatAttributeTool.swift in Sources */, E81A7BAF2B885B20009E736E /* MAIDESEncryptTool.m in Sources */, 23630B9B2BABCEA5003AD25D /* HomeSearchNavView.swift in Sources */, E8D15AA82B89B74700369467 /* YMRequestX.swift in Sources */, + 23630BD32BADA9FF003AD25D /* SendGiftSendNumModel.swift in Sources */, E8E4AB1D2B901B9D0096D77C /* ChatKeyboard+.swift in Sources */, 2311D6C62B917949001C70AB /* HomeVoiceRecordBtnView.swift in Sources */, 23EE97072BA2AC8300475D69 /* SendGiftUserCell.swift in Sources */, @@ -1372,6 +1472,7 @@ E8D15AB32B8B000400369467 /* PlanetStarVC.swift in Sources */, E8FF28B62B90ED6C005D2BE7 /* ChatNavView.swift in Sources */, 234E2E332B9B019B00433CF7 /* RoomChatScreenHeaderView.swift in Sources */, + 23630BD12BADA900003AD25D /* SendGiftSendNumCell.swift in Sources */, E8D15A9D2B899E1500369467 /* YMNetworkHelper.swift in Sources */, E8E4AB1B2B901AF50096D77C /* UIView+.swift in Sources */, 2311D69D2B8DC311001C70AB /* PlanetStarModel.swift in Sources */, @@ -1379,6 +1480,7 @@ 2311D6CB2B91BBF2001C70AB /* RecordVoiceManager.m in Sources */, 23630B992BABCE52003AD25D /* HomeSearchVC.swift in Sources */, 2311D6C42B917619001C70AB /* HomeVoiceRecordView.swift in Sources */, + 23630BC72BAD7A94003AD25D /* SendGiftView.swift in Sources */, 23EE97052BA2A67300475D69 /* SendGiftUserView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/Contents.json b/yinmeng-ios/Assets.xcassets/room/Gift/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/yinmeng-ios/Assets.xcassets/room/Gift/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/room_gift_slect_bg.imageset/Contents.json b/yinmeng-ios/Assets.xcassets/room/Gift/room_gift_slect_bg.imageset/Contents.json new file mode 100644 index 0000000..27f1c21 --- /dev/null +++ b/yinmeng-ios/Assets.xcassets/room/Gift/room_gift_slect_bg.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "room_gift_slect_bg@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "room_gift_slect_bg@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/room_gift_slect_bg.imageset/room_gift_slect_bg@2x.png b/yinmeng-ios/Assets.xcassets/room/Gift/room_gift_slect_bg.imageset/room_gift_slect_bg@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..36b40672a5eb0ac308cd71703442a90a4b944748 GIT binary patch literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^>wx$e2Q!eYDfNC0q-+9wLR|m<{|{vT`}YsXKn6e& zG(j{jQ1MUE$$CJ|A|*k7!BPwrVL1sFik_Nw&glY1daMDyVtxe+^BEWzA9=bshE&{o zdpB_15(NRbhe-#-HfHX;{`Y<9mTH}6Y0s{<*juKv#%s0uv*~!GF1$X?W@)_h)Mb0N z{4dJ(+nBSN_v)UhGm8GU-@dkm&#m;6W48Uy(yr#D`wuLx?%!FhWmcm4c5d|L!))&- zzB-zF`N3ve?cm>sbuY4XJw3cO^Fi>n*}=8NpRU7uyVdHi}Y{Oe@G zpBeIRW(9Mg{7$XSk}$qr%zLqQoTUY;PlkNm;dEPoZ{4|y*RyZ?EZ#XcX6DChuVugA zWw~{@U3(MX+ry$Cw-pq!etUSQ<(%x_Jy##xS#74XW7~(xuOHQJSbF1o|JLHAzj&QX WMCIlm9EjeCx)y znpxG-^F@m;RKA!xYrbgIiK{K>}RP8eF?4IzRaT;?HxbvWEdBi|^ga=6&ewDiYwp$SP77YSB{84q*cYTKz>% z#VrKOAc%c|HxBLQWrZsOvs&{-FU2XkE8dZA<@+9`*!tZo$64X~=N(ryZmf5iFS6y( z&ZU6`@@;mSGx!f*ay|Gf^~B~wArEg|TDPFUH=OnP+!w2xjGeQ>H`wwnjXhW<6;#d@ zT)mffb?NE{J497&0|RzhguI%0=n5a-)l1y1D>q;JAJ?%}E4pgALFx1T*VeMPdRQ^F Y)|l^B{2sgknBN#YUHx3vIVCg!0BO#x5dZ)H literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_arrow.imageset/Contents.json b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_arrow.imageset/Contents.json new file mode 100644 index 0000000..15edc94 --- /dev/null +++ b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_arrow.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "yin_room_gift_arrow@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "yin_room_gift_arrow@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_arrow.imageset/yin_room_gift_arrow@2x.png b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_arrow.imageset/yin_room_gift_arrow@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c1c2ab0dbdac5dd605aa56bdafa25562f9e37b GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^av;pY3?xs=ZJr3ER04cLT!HkbPoF-2{(SrP?T;Tn z0@-lz<;#~hZ{7g8r*Fr40M&7q1o;Is%*kN?@chKVjn>j@1#?4y!ls@sjv*44lO;qJ zxH3-NU%i-7tG--Js{S=g$iH{K8Gr5`%J}n^<;S6nXAigQbKl+j;-91n1HXn?hVy4sKgIsj1M<*;0P} z{Z!dcaH7M}71Wsn)>ihDSfAv$&jJ0n*U0)wDA*E{(|H`F{d9oQ( zPA``74|2D>_pJM($El1HQ5?Km&SmJRFHQt<&SlKFeS2A4{iR)(btYTAU2w(cE?@cd cz%R?CL(cQ8GGpYq2DFXA)78&qol`;+027mbtN;K2 literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/Contents.json b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/Contents.json new file mode 100644 index 0000000..59a7e1d --- /dev/null +++ b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "yin_room_gift_diamond@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "yin_room_gift_diamond@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/yin_room_gift_diamond@2x.png b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/yin_room_gift_diamond@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..68f282cc087df91a13dfd471d46f0f8adde44906 GIT binary patch literal 1711 zcmV;g22lBlP)&-#eg z`+L^>WXJP_*ZeWE?`_2JJFo3Mv+RS{`*O|mRln*_$^9d@X)AxVQ_Jq;(f!gzN$?|2z@paPg zaMABq%j;pu>qEQd8mr+Yuiz7*+Lqw|g4+FX(EY*h{Hy8we%Jhj+xxfa`jX%JUB~*F z;P`jf_-xnsKhOA$)Ax(m_BpKZRKV|0yX+ve>T%TRSHa&{@wWg*7p9p?){&-P}__I}v%W5@D6uJUHq@jRiU^OUCLr#Oe;W>QTe#O~L3Yx#(TL<}|(K9Jb>Qtl}`T z;TEsqA*SIKtKbKs;1ICf|NsA4&Hl^m{fyrIxa|Cn;{0~m{FdPQQquW@*!WG$_@C$Z z3B>kz%k_-g^Z>l{NwxH!-}7w7^G3|_j@<8m)$dut?}XUyY|ic)xb08G>S@sFMz`lL zwdZQkOhpW`^P;vTZ%P08RNuHFEa)8_vF%=iD3+5Jb? z{cp(oec$?J)A>Ta_@n6e6v_8bxAlqM^iR(6ncwh{*6&ct?PbdBCbjH8z3U>b>wnkj zL$>K%&E!zJv1fbeD4(Z4M001;}QchC$2ZX-hHu z^y=f;*0`{klYn1dS5-0$_VMoL=ikuF%E!mW#JjYmi+^)(YG6hpJ($J-00T2gL_t(I z%VHS*fK@`12?*HP+4=c7I5-3Zw2iSVl-5(^*7A^z%?MSg zQhai4ty7zCP;gLiaBwbAp$|~uwpuf%{=`H^WR*e=4)yh3j!j+W+sw_)&42(%0#vu9 zuG7ydEiaLe6`@kZA>OMY$s&DUvXhCmwTp#?b>@VCfB<{5$^Mp>R+DQq;3^FqOdTDY z9a3HQHCtJ9TctTWTUzwzO?2JsWMb0Y)oq)9G{Tf*tB!k(TfJHx zon0pEojBFSf3mfopGA5`1{WmY*=kIicD85l$vOPQ-o+$1uix6=-_OEfdzNdub6{3_ z=I#m8o+*QsGG=7#+LM!$Gv)As=FqF28x|JK2y-teTrjP@J=-$V)ip4%H*gw23J?dV zems?z`sl@hDG%P>tM;t?QZQpi!Mv-Uakf0YyZr(Jrv^A#rwBu%Ue2TB#8LmWhWobn zs)1@3&YQQea)W1FTwGChmx+_TeOf{a3oNR5J<5tt9JO-(6X&_1^45g~3knObUHi6b z)hf#^b@ui?rOOx3hp0T% z>e!i@st1%uRePiC>-R-5cD6TwroM-mYMJDmk{}9{MOVAd=FTOXnAmmYAjblgx|t*; zPfS6mL;$Xfv8#Wcx3jaYh+a_=H8*08o7MiTEMcrUM)Km_Uw3R`syxbV&P7Jeoon)Z zPPP_~Y$&;M^Y2JIJCNEXk&$!u&vI46nPnx4Hea^c2vNJ_)vT$4c(ONV(dMOg>u**9>ouPY13tB9m#yBo{`Q)cm){+iXJNn#^p`D*S-XDCnw7_S7#Rovv9nh;t-Z2# z=~iwAfvaGC literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/yin_room_gift_diamond@3x.png b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_diamond.imageset/yin_room_gift_diamond@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f0dc0cf19f1f2b733bc92e77bd10b6a9b1841132 GIT binary patch literal 2582 zcmV+x3hDKUP)Sc!}?so?>xBaGP&hSy6r)>>|4+Ea?Si4w(Drd{5i7kPt5fwwC+2! z=}NWqV8QTr(fK~E@nFRJh}!&w+5BkB_jS!z`#-hpebV|xwCQHW{Dj*5 zZ_@iYw&^aj?QhEXf!6$B!}M3b_j}g-GqmSd$@OH$_cXEWf7SU_#`Jd3{4BNZP`>Oj zu6X{vE68DYWQ3t?+5a{42NSM#1wd{G* z{Zh;MXUh2#rs#s#{cOnmSiAFl)%%6l`cb>_hT8l#u7(QL zsO0#x=lU(O;=b$peAfA5!uy)x`CG^9Bd_7g?fahL_cXNQ$MO8b>ie$c_({I!9H4qc z`kvbPnArJn)%Re~_kGy%XvXqCukm)&@Nv@cZ_e&6w&f+M;0c}D&GY=Y?EHS+{CLv* zVAuMJ()ef7_m|!FYt#0E(e;7Y^KZ!WS-|j5zV2el>r=<;Ikx9Pz2+LD-Q@WGrRDs2 z+4_ju_)oa?liu`)+w@Pn>rKSz6SnC`#OEfp=0LjTAhY5VvEc=p;FID0)b{=0_5Fd@ z`?Tr$Q^fg{*7kkP^>)kjN3-)dz2*y|;v1{rAE)5#`u?lx{j==+aN7H^==z}H`lj9a zRnz&9)c6;~_F=^GebMn~(C&iQ?L@ilNV)7_#Orz0>1@&FUd-f3xa35%Ysc$9yy+{tTSf(aylXb7B7S+}O{vqoJRbh1KFX=(NRnof-wKTLbFLaVq+=Wbe?X7z?l zojP^ev}wbK57*Gp=!#|bit)Ni9e=;JZm%)(X7%2&56kJ(r~Uo?uUxr&dCQh910Y>z zkJi^#=-48yq^`em-mD#vp9NrOh{o&{`szw8@STS)@4CKs1D@yR=Jxp9-o1woojQ5) zptG}cMuxL0CK#Z)v0ty|1uFWQ)5Tk^_@DO2U^#sXqccueTJC{Zs;a7r#f$qkD^Tp! zCnDk!<*a3f^T|UP3pC(z9t3AA==6%TXt7we@33FrgTlo5xCl;?cOs8lvBxsw1Vp~- zSx7|%Q9!>P<;~lgCg$H7G`jyUvs3RkJ%VEq>CKBQOY$Mo=_C@JPT$&?+fj*$iM*`> zB9Ut{8I?gKQdRl4x~}Q` z1Ftt$GlIjRMbaF7EPM&R$y_0YiXbS;WTFTaXKwDt_G9vRsH+Tkp}8ubzjVR(GwiId ziQ`-UsSOoKU2qI4n@vGc)CX62KX&*U9XYNuda?MHQ#sHn zQmea}nUdt&M2hTzjEbNP21Cd|5er-u+ePZfM9CsHjzXc}$g!_q&mAVOe&SMoWo1f= zM3SC<_s+dHnNBgt+owm5KHUqO4@*`Snap4=Ky5DE9BzFM6CrLuC+P}2Fm~aj6?so2+n|tn}(u4#%PY;5`DGim8K|rQ3#A0%v z@!!TjVV-jR$Gw4pDUx)FQ<+1S-Ajxw^~`gJYW%BUsyPWC(wED&81UtJ@1LGG(SD&7TJcAr~o0XL#qkF$f^p5n|4fs%{9}f?$!Jhbf zlY;#G>gw~xrbcE4#$Wlv+Yao{%5e>R5D-8?1h;uS44=|x=;WUdFRj6NeErUXclkN_ zCZ=aF!HeT2I}L%i*}vV|H83#HoJxcbw0Rr^J)i>o&TR$xIfiCuOpOeTcgcAWUWbc1K5lN+k`l-X}Z4*ENAUN(79OMCp?ExZ!72vJ^04Vey zGBd0;^nIKWbYQC-2ZA7vY-<++VS^lRUC<>gEHuvc%$Wwk`{3Z9Y{J8bR`P4FbwM{w z5Mpb3-83}hxpG|G`yh{p4+(vTDRyXE6hUz8Sc%c~>m?v~{yeV!ks3jMVYIP=?jWeS zUJHWIkdTnNM{1)w!Rl=nOu_`k#kFB2B_%Z>fWv+FCsD)%#qsgAVPVBJb!wx=0p1Ql zczkVqe8{6EHq)$ literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_select.imageset/Contents.json b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_select.imageset/Contents.json new file mode 100644 index 0000000..debcf38 --- /dev/null +++ b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_select.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "yin_room_gift_select@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "yin_room_gift_select@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_select.imageset/yin_room_gift_select@2x.png b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_select.imageset/yin_room_gift_select@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..36b40672a5eb0ac308cd71703442a90a4b944748 GIT binary patch literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^>wx$e2Q!eYDfNC0q-+9wLR|m<{|{vT`}YsXKn6e& zG(j{jQ1MUE$$CJ|A|*k7!BPwrVL1sFik_Nw&glY1daMDyVtxe+^BEWzA9=bshE&{o zdpB_15(NRbhe-#-HfHX;{`Y<9mTH}6Y0s{<*juKv#%s0uv*~!GF1$X?W@)_h)Mb0N z{4dJ(+nBSN_v)UhGm8GU-@dkm&#m;6W48Uy(yr#D`wuLx?%!FhWmcm4c5d|L!))&- zzB-zF`N3ve?cm>sbuY4XJw3cO^Fi>n*}=8NpRU7uyVdHi}Y{Oe@G zpBeIRW(9Mg{7$XSk}$qr%zLqQoTUY;PlkNm;dEPoZ{4|y*RyZ?EZ#XcX6DChuVugA zWw~{@U3(MX+ry$Cw-pq!etUSQ<(%x_Jy##xS#74XW7~(xuOHQJSbF1o|JLHAzj&QX WMCIlm9EjeCx)y znpxG-^F@m;RKA!xYrbgIiK{K>}RP8eF?4IzRaT;?HxbvWEdBi|^ga=6&ewDiYwp$SP77YSB{84q*cYTKz>% z#VrKOAc%c|HxBLQWrZsOvs&{-FU2XkE8dZA<@+9`*!tZo$64X~=N(ryZmf5iFS6y( z&ZU6`@@;mSGx!f*ay|Gf^~B~wArEg|TDPFUH=OnP+!w2xjGeQ>H`wwnjXhW<6;#d@ zT)mffb?NE{J497&0|RzhguI%0=n5a-)l1y1D>q;JAJ?%}E4pgALFx1T*VeMPdRQ^F Y)|l^B{2sgknBN#YUHx3vIVCg!0BO#x5dZ)H literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_dedicated.imageset/Contents.json b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_dedicated.imageset/Contents.json new file mode 100644 index 0000000..9a271c6 --- /dev/null +++ b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_dedicated.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "yin_room_gift_tag_dedicated@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "yin_room_gift_tag_dedicated@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_dedicated.imageset/yin_room_gift_tag_dedicated@2x.png b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_dedicated.imageset/yin_room_gift_tag_dedicated@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..699d6eeb426f13c7e51e21ea4b2d6f1ed04005de GIT binary patch literal 666 zcmV;L0%iS)P)I& z|J=s@+q?e4 zlK#Ar{=$4Q^`?Iqt(AwXMHHV9TzHc4V=u77FrENYR9vIQ31xHDqWm%piaKFMOc>!gy zDIZ_7iF2@b!qH8|T5g%^g_PPeB1;&{U!Lj*=C0eUt2)jSYz|x^EcssWP@O`-OG=Pi zbGxhfu;1^t$5d)4B4Ltr89qSwXXKchA*B$8F=#DFLiuQnVdo z$4&sDh-SVp6oFEwL&g6i5khTrKYhX2xq|IC2@qgwx!P5;q_|ILB_pjiKvP5+-( z|CUYv&xQY(QUB0{|NsC0no|FyTmP6(|CLSupjZFMeE+s=|HXO#omKzLfd9U8|EggB zx^VxeUH`Ob|G{?uu4MnQX8)~X|N8j<+Q9#hNB-7_|B6BW!khk_R{oe#{i5Py^#K?b^fSf{+L<*l}rABIsNbA z|DR+3qi+7OZT_ul{*6ridNcj&-v8&=|J}s@#Gn4Kh5oF4{;+-i)2jZyg8suN&eQ+^ z02XvoPE!CZ2lVu^vWPD#@$vET(b3V-h=@f+=4#{&0008@NklY`` zwLIz8m(S17Pd*JFF0ZHZXi2+&=%phybLr$iTEg7?^1{sT=qoO6VeWFC)*!V~Y@YU+ zU8B`=R`2c`Iy*b#U&^O3U8P;9%z>SzfiuqZE^PvVae$|VLZMW09H&r#UYNZ}3TX)G zIDYfj@2dbFn(;dz?RX+!Dexykh|a+G0}KbwH1SRJ8679^2Syb%l(u0My)q^}Km>*$ zOMbC`-L8fhdtF7(?RItG`6XBYXv(Blbj>J!#(ihEw~aWCqY<_%^Mg>B3UJt{6nKU$ zM^O}F|Jm^V=B-}6ZiUTOle{c1rC4&_gIq&zX>=kV**3I@8My&R$nNqahN20fU+Vb^3%#Z z)ivwA>uSIL@;a{bztpA6FBo1(Ts}c@9;o5Unia)yqtUqSg5Fp%Vd^meWyU{6P&=vJ z4`(s(OGQ*}B2&6H)0B{>1GR107kAu~lUDzA~HsgAUR#8mnA$Y;E`#N8W_Rby)4 zvy>L+LE4G5#?1?%>huy*CQNl?!04FDQG8$RD%%~^Kw&}nB89ZHU00fx71hQez5@5^ z0I)jR%AlgkM)9y!#a7bI>=x~%NJ~6f6V_sGrc`I_(Sb2{N=gZu1__H&dO$e{9ZPKi zd8oF^=P1A8%DK`~r>)j2d7|7G`H@+CE%GlpLdUS?{Q4^%0C`NR+zS581}>)XN{)2- k+~NMV^-0_Nhq*kfKWaqXRyVsp-~a#s07*qoM6N<$f>~Z)MF0Q* literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_effect.imageset/Contents.json b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_effect.imageset/Contents.json new file mode 100644 index 0000000..cf76bea --- /dev/null +++ b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_effect.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "yin_room_gift_tag_effect@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "yin_room_gift_tag_effect@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_effect.imageset/yin_room_gift_tag_effect@2x.png b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_effect.imageset/yin_room_gift_tag_effect@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cd10ead870caf13236a52f213b37270262b95dd6 GIT binary patch literal 748 zcmV&|NsA} z*8il^|7DK&{++-5X^{Wq>;Bc`{>RwPx#5Oh*bQve3f&&O#~T~+@?;jW#{d8Uwn;=mR4C7F&uMd;Fc5&@ zB|dVuY^nm13>M}vV8Gz}jB~X8|39fKYubr3dA~5T56cb!VD-A!PoKK(_AHVfvo_Tw_67W6J@G#dT)9(2v@=SAj)F5H}DICMTVG<*XiL%wSE8?{#JX#c8w&2#|h zBSf#ie!t+x^Soq=h1zVK;gA5#+5w+ma1|dH(;TUT@-@TRM1*fCE|yW6R+y*hQ7DHL z9LM*Cw@2NPWm$uht>m8Yea8VZC6Zme%<*|uPF6KWQBwS|DCq~>+t``*8X6I|M>d; zT!j8ufBwDD|L^qws=)q!pZbCv(D-T%$l{&|`GW{LizzW$Z3|Igq4x5)ml z!vB=H|KjWa-RA$)-~Y7E|Eq3<^o6RpPHJi|4@w-khDktpo-FA0(UdTS zBLb{8XILEL{#n=`pX70utF9b9GBl~gG2LtCxW#;Ub~ffaUDp?ub`fMf=z+$#7q$DB z-EOzT+>y)7Rf`Bvq-!6u20JjUB+Z$7sbP9yu(0$=Bu4FcNlVBK^z^*wPsTyuI*ur+ zq#O8$oHuZYqfs$web3`I-V;Tg4)<-$iY1l!{6@q-4ScQrgM#k{8dR1Xm4O}d>aT8H-Fxvwh}# zPGyAW9N_@mF+l^daA5}3{qqf<=tXL9ggYF$M|JVmj(sDF9os@$T|LKj2y#{7&Fv1HYR$JUU zZ^>$!Whhx-vY%6BvL7K&oqU8Pm**3+D$Uh z8&D6kq0kUP-cl>E5QXns-u z)ewrHU($vSid4IrsR4K!wB^keoXS6~=50~!^-}&lv(m3?M2{cdW8|qBiyl5E^iHj% zKTEc3F5i*%_zmveAM_j9)M{HBubzFqr)RG=wrZk&0bZl-Ek}n1kpKVy07*qoM6N<$ Ef_0E(p8x;= literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_latest.imageset/Contents.json b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_latest.imageset/Contents.json new file mode 100644 index 0000000..29168bb --- /dev/null +++ b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_latest.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "yin_room_gift_tag_latest@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "yin_room_gift_tag_latest@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_latest.imageset/yin_room_gift_tag_latest@2x.png b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_latest.imageset/yin_room_gift_tag_latest@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..01196c8590bc300b00de3789441644175705ae83 GIT binary patch literal 1075 zcmV-31kC%1P)ytumH5u%{gB7|hQIrs0$@#N7R;()^jk`<=o2kH7nry!(dN`iaH*fWrD*y!v0b`i-{wT(tUI zu=;PS`gzIubinyxulY!v`CO>@Kb!bVllVc7_`Bfzz1jS?*8Hy1{ISmbpw0W4%KKrx z`a-SxgwFYW%=u-%`E{uIRiO9k^8T>j`=i5&!@KJxN4CR4C7F%w=~PVGxGl0UFnK+NMC*#lqst0>v%3 z1qmK^*T$tuYX7^lAzzY{>&xz$`#diINJa)ee0$@=z=#CMSl`!o^^MW4e|ma)X6DOl zGj!{hz^M2ym&?`PpQ(wQh}TgVl#9iz(WtsK#B4Un$sl}Gt4(H&>RzYQ6P@T@Mct%U ze*%-qWL9}}`g$xqkdjceGfb;czZ9^OJ7S9`jz!eB7{)F}yWP(4e0Xoj|D@{sIGM2z@2u>OtL`h?E< za?JXB#rkl<`em{DKBW47$@x^P`B10%K%4o8*ZO(U`eeZRWW4%Mtolo_`DCg2^7#Ko zx&PVf{-ekIkly=LxB6SP`dP91V6OQ-m-$VO`AC-dIFb0u<^IOr{kYlvhSd6U$@+-J z`dGaBc(M9ur}}ce`DwiQYPb1Np7~Oe`9PBStMdPz>i@Lb{jJsgna=!`%=?YX`4-&fxv8*!-r`{HxFWqRae_!TXH6`-QjrWwrTW zv-xVW`CX{_S*H0{q4{vO_%VX_p27QrzWbYiBGCW<02p*qPE!CZ2lMoZFDmiz@zK%I zva+(Wh=@f+(a{Z~%GCe>1XW2yK~y-)h0=Lj55@7STWuP!JH2 zLqG+TOEdxTATaOyzHd`2E3Nn0Z+1!T59__WcKSGzEC6n;3t`1zl_m0cw^92HufCT(Nr17;_oJ>Buj9#-v23`?3WWl@EW2<#+ zY>ZtIfDalNXk@k*EeDl|-S+%F0N& zN)>SVeM5^*jIqNJ(~W#&n7KV8gE1os)T>mH2r!@kRrM~v1)sJ0@pL$+cY!T02U-qQ z)w}fS1=^BGSS&_tbQ(v2GR8z-|K6emXuYZ&FalUrPr3Z+iKAb%an1gjVRlCBKtFYK zbo4e)sQr2uRbN$ARgU1Lm4ZztnuBnJTF)|^);?8>@&4qG@85cx$JP3*MXjx^6gB7{ z|I+)N#@M-4iC!PLgU78;Q zJ4its)u`LP;&XKZwKyG^^sY^sTrtKe~9XN)O256+M?lzzh0;o|(-Q7K*$+TyL!Nw`ihbfN}GoxD@;KQLF zcUzRTNTV^CqHXT(;L5==Iik)&>#*GdPs}q4bTioFc1NQojYfk^CX*qmfKBJ{S#}!J z9zrcZyWNVY0T?nF4Alxnw=%TiplJu}O4D@A&cG9%2I|}lD!UbmYJ=r*BU ziqdKbm6n3+Qns&K;mM2ur7<{+H>OiS`#CyX3L%igQbHFnUWEhn!=Ebg2^%x1a5Kic z!gi&sODbil6q3tiT45jF&#VGXAMU3U_#hP~bWf;#FOzpk0ZS2)a@l*WaMu}Xp4Z{I z=}abrb(7(61<(aTWpcR`LUO3M_`TL#VOzk^d@7Y%#oL<|6@)GVEiRU`A(>1@q}D7H zt`GGA4To)3-J%WX7mSyLW@2TK99@wWL)tPk*cO}3Y6WDotyi=Ng~}ymfw@epg?YeN z(DnE!1q-;P1r%3-&}=S)h=^ZDd2#YaBr*$X3WNox!LX*LMj#N0L}jdw=OJEPL=p%D zH8nt5I0+0OmxwLSL;Tx>35tpYaB)sh1Ox5{XUTP&j}R}ni0kqBipa$dxN><2dXU@j z_&+t|K0s`|I}HsDPc955@9Xa)r;iS8+klFQNIB{5R%higQH9U0000r@Ol>enH|LT?hrY-;Kl>g<7|FAs&p(g+8mH+6G|E)Oxp(X$9m;a$A|NsC0=#&4W zD*xn=|DYxR-i-gDF8|_<|NHs>_woOyGykP7|I>p0#CHF~TmGOi{_*Jl-iQCmWB;l( z{+KiWw@d!4O8%ZR|DrPg+kgMpe*e*Y|I&B-EQ=8*s0 zg8sjL{>*y*$ant2X#Txk{*j$wsZc%as9Sy{h(<6w_^UXVg9>W{;pR4 zxl#V3P5h8e{-a3!ib(#WLH&Y2{e3?Di#7i1+5X?n{^iO3-M#+Oy8hR+{?4)e!=(MZ znf<$y{j!bzy@&m?g#E00{>*Ux$#4F}Z~m!e{=Q@W!eITFUHz(zphW(mKmMCO{CYJ0)S&*!oBq<1{>p*=!h!v!cKxPp{>5hfpI`pBTm6+l)zJ5; z0000GbW%=J00z&`Y;5xK^76;W$HyBR3~R!N0007ANkl%oWm6kb6oBCyNN_on z((IbsBoFCc`HNg&rAnTL-jchEM+33AWtyTWM44|aqJ@v3 zDG-nZ^8Fq$L4apLWVta@$eft%5xpIRJ~hB1j>|NyCJq)v!dbH!C1!=CNRvPpfGiXa zfj)a!67>iZ2_zKuq-^hopnLVlw@U}1aSynmcXY{?vI>RBYE5Ozan%Eu`|Q^m^ex#k zDXSHw)7eZe{{_13_EAs|-rMc=xN9<>%Vg7ORFhSya(U5=xU=(NuCqjJ>&oX;s%#Bv zPzeM)UYA5HeqACKizSjS9#0@pH6RXd#VC387j8J>%0aBkmqjoBQyNvW5NfV`_N2;Y kgt0h{wa*`^ZRFs+-`x?LMuAhPA^-pY07*qoM6N<$f_dkYmjD0& literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_limit.imageset/yin_room_gift_tag_limit@3x.png b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_tag_limit.imageset/yin_room_gift_tag_limit@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2b414f5e299de6f1a5abe8e918e1c51e641b73eb GIT binary patch literal 1758 zcmWkudo&dI7au7q+Vd-8^UB6=Se0xZKaYylFd1VojiFR4&pdu4WY|UC>-|XNvBnsT zccVOp@=n$!VuUARF~vh6J>Pyv=YL-j={*Mvq2 z@NUCn1K3)FzZ0O>1Ns7?;}<9+K#>+qMZsVs^oBr}H*`6n2U@#Zp@v()wSxvSl$=G` znlKXwl~kzGgSQDV`a6t7!B7Zv2cb4UXtIU&D^RX42-AbHP}Fe;TI|syE5xRv0&^%N zK*3q4)I~j2z|Vw{V0aS%gLHW1i>j`nVq0jTp;B|;nh5CXFx87XSnxa<)g-_~IPgND zD?kuW79?H-4qgy$h|;uxp#ht#@O~0HT;YWa)H?y!3TiAMUkjyZ34+yO{te9VP-_l) z9EG0Vg?2A^;elG*;pt82a6n8vO3;E56iB6b#hK3tqf(!jz)Kv=oCGe&gHK(J> zU_prw;<%woQ7eGJr{g_@$#^Sh|V8! z6+6I_%Yv-Sf>hd0Bmw38j8abv=qfPVgGQdga22WxM2-G}ST!`0So6{%WcL&#?@%qQ zFsiES>%8jf*jQ0fKA+Fy5eR&~rrr1;2D8`4)c68T_oaV-%w_5&xi~K=b=$D=6+h_L^YXzTRwsm6ol(ZoQ*o{A zbJLd;)NvG|v8ieB&g(CZ9WgCds4!4!WGQShTCZO< zGNNnyMqW_ldDQu&#M%6jd)@Uf5~^L@kgc4|Vdmv}6G`3GgGx@gQO6T(UpIM-RFiV@xX@UGqlj>poa4jj zfwMNn-yQP4kRNH+;QrOg!-HyTQ`Si}A(^eX%$Ak?(8%?111v^-eR@I0Q=%($6@M+6 zTbn*|>A^dS^=V9fnN)uB;YGXzH$rxv)?rjOJL^JkWQ-6L>7|kEcNnuIwXmGRaFlHz zV*j!|Su!JIG>(W%ySpG|qeoAbk82+q(G_aX@`~|jco&JamUeKl%Pe&K&myKnyf!z~ zNU>PGZO}&d>DtbNd>Z|qGPy55rw(K4*|R%hZQDy58ygR#i@tnkZ5Km5nGqjLE2kw( zSwG#;FB0_AZ{Bin-}o}xB9_GnW_0Toyf-#0VssytX1^r%JwNmRKOOp)W#+l+fnn{z z4C{;-t`(`YNAs#b*QiKev&~EEsL`3Zm?Ua8x$HfTB;74h)J5zy!6Ymbf4O1b)X)$} z=RBLMrOVoyIcwbK7mY8~T2nkk7Ao@CuE%0R{H)XiUd;{KS|%!IlP{8$om>LyU)i<| zoDylX+!B&Gim`uU=(_T~jJY!DRP>}gBbQxb7FO^(wMJ}gktHgYYm@S*dcavRBLmOs z`echvFcDuDd-dzR&2?3c{`rUl*TQ#dOimkIjPp14q;4tAZl=5JdcroMm^ZKrjxjLH2h&b;kT;#yUfwfHiOd%VaqfP bc!2H?nr9RD`*zPspy>>ru6{1-oD!M<1!ZMZ literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_up_arrow.imageset/yin_room_gift_up_arrow@3x.png b/yinmeng-ios/Assets.xcassets/room/Gift/yin_room_gift_up_arrow.imageset/yin_room_gift_up_arrow@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..42880a7a98e53dade09bbbfcb41358a2e20f74f9 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK3=%mav;s)k1o(uw0_p$cf*YP0!a)7PB|(0{ z4Bw_0@v**petT!BgUp2!i|2&-`f`7N36yT}ba4#vIR5s6HD9xVh|9%v>6`<9ZvKx; z*7OqGp{!`7a{rf!aoFm;TMT6Hh&Y^Y&tiMKq-??7D{^0MaNp^-*zA0V^>7i3%;wH* zB?mK&L#=mwmUYgawO)O%*qZEV_Ipec9=QMNtAFx-$DF$Il-(EQ_Pf95I?(?`R{nAK iw+i;p5d~|%ZQxJL7Y!)Ze0vY*9tKZWKbLh*2~7Ya`<5&K literal 0 HcmV?d00001 diff --git a/yinmeng-ios/Base/Security/YYTextAsyncLayer+YinTextAsyncLayer.h b/yinmeng-ios/Base/Security/YYTextAsyncLayer+YinTextAsyncLayer.h new file mode 100644 index 0000000..6e49de0 --- /dev/null +++ b/yinmeng-ios/Base/Security/YYTextAsyncLayer+YinTextAsyncLayer.h @@ -0,0 +1,16 @@ +// +// YYTextAsyncLayer+XPTextAsyncLayer.h +// xplan-ios +// +// Created by duoban on 2023/10/28. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface YYTextAsyncLayer (YinTextAsyncLayer) + +@end + +NS_ASSUME_NONNULL_END diff --git a/yinmeng-ios/Base/Security/YYTextAsyncLayer+YinTextAsyncLayer.m b/yinmeng-ios/Base/Security/YYTextAsyncLayer+YinTextAsyncLayer.m new file mode 100644 index 0000000..7d7fe56 --- /dev/null +++ b/yinmeng-ios/Base/Security/YYTextAsyncLayer+YinTextAsyncLayer.m @@ -0,0 +1,27 @@ +// +// YYTextAsyncLayer+XPTextAsyncLayer.m +// xplan-ios +// +// Created by duoban on 2023/10/28. +// + +#import "YYTextAsyncLayer+YinTextAsyncLayer.h" +#import + + +@implementation YYTextAsyncLayer (YinTextAsyncLayer) + ++(void)load { + Method yin_displayMethod = class_getInstanceMethod(self, @selector(display)); + Method yin_swizzingMethod = class_getInstanceMethod(self, @selector(yin_swizzing_display)); + method_exchangeImplementations(yin_displayMethod, yin_swizzingMethod); +} +-(void)yin_swizzing_display{ + if (self.bounds.size.width <= 0 || self.bounds.size.height <= 0) { + self.contents = nil; + return; + } else { + [self yin_swizzing_display]; + } +} +@end diff --git a/yinmeng-ios/Base/Security/yinmeng-ios-Bridging-Header.h b/yinmeng-ios/Base/Security/yinmeng-ios-Bridging-Header.h index d3892fc..c5eb981 100644 --- a/yinmeng-ios/Base/Security/yinmeng-ios-Bridging-Header.h +++ b/yinmeng-ios/Base/Security/yinmeng-ios-Bridging-Header.h @@ -13,3 +13,6 @@ #import #import #import +#import +#import +#import "UIView+VAP.h" diff --git a/yinmeng-ios/Extension/UIButton/UIButton+.swift b/yinmeng-ios/Extension/UIButton/UIButton+.swift index c819944..5505d21 100644 --- a/yinmeng-ios/Extension/UIButton/UIButton+.swift +++ b/yinmeng-ios/Extension/UIButton/UIButton+.swift @@ -35,14 +35,23 @@ extension UIButton { return bounds.contains(point) } - static func getCustomBtn(type:UIButton.ButtonType = .custom, text:String? = nil,selectedText:String? = nil,font:UIFont? = nil,color:UIColor? = nil,selectedColor:UIColor? = nil,image:UIImage? = nil,selectedImage:UIImage? = nil,bgImage:UIImage? = nil,selectedBgImage:UIImage? = nil) -> UIButton{ + static func getCustomBtn(type:UIButton.ButtonType = .custom, text:String? = nil,selectedText:String? = nil,disabledText:String? = nil,font:UIFont? = nil,color:UIColor? = nil,selectedColor:UIColor? = nil,disabledColor:UIColor? = nil,image:UIImage? = nil,selectedImage:UIImage? = nil,bgImage:UIImage? = nil,selectedBgImage:UIImage? = nil,disabledBgImage:UIImage? = nil,masksToBounds:Bool = false,cornerRadius:CGFloat = 0,borderWidth:CGFloat = 0,borderColor:UIColor? = nil) -> UIButton{ let customBtn = UIButton(type: type) + customBtn.layer.masksToBounds = masksToBounds + customBtn.layer.cornerRadius = cornerRadius + customBtn.layer.borderWidth = borderWidth + if let _borderColor = borderColor{ + customBtn.layer.borderColor = _borderColor.cgColor + } if let _text = text{ customBtn.setTitle(_text, for: .normal) } if let _selectedText = selectedText{ customBtn.setTitle(_selectedText, for: .selected) } + if let _disabledText = disabledText{ + customBtn.setTitle(_disabledText, for: .disabled) + } if let _font = font{ customBtn.titleLabel?.font = _font } @@ -52,6 +61,9 @@ extension UIButton { if let _selectedColor = selectedColor{ customBtn.setTitleColor(_selectedColor, for: .selected) } + if let _disabledColor = disabledColor{ + customBtn.setTitleColor(_disabledColor, for: .disabled) + } if let _image = image{ customBtn.setImage(_image, for: .normal) } @@ -64,6 +76,9 @@ extension UIButton { if let _selectedBgImage = selectedBgImage{ customBtn.setBackgroundImage(_selectedBgImage, for: .selected) } + if let _disabledBgImage = disabledBgImage{ + customBtn.setBackgroundImage(_disabledBgImage, for: .disabled) + } return customBtn } diff --git a/yinmeng-ios/Modules/Chat/Model/ChatCustomMsgModel.swift b/yinmeng-ios/Modules/Chat/Model/ChatCustomMsgModel.swift new file mode 100644 index 0000000..3a0d7fc --- /dev/null +++ b/yinmeng-ios/Modules/Chat/Model/ChatCustomMsgModel.swift @@ -0,0 +1,23 @@ +// +// ChatCustomMsgModel.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/23. +// + +import UIKit +import HandyJSON + +class ChatCustomMsgModel: NSObject, HandyJSON,NIMCustomAttachment { + required override init(){ + + } + var first = 0 + var second = 0 + var data:[String:Any] = [:] +// encodeAttachment + func encode() -> String { + return self.toJSONString() ?? "" + } + +} diff --git a/yinmeng-ios/Modules/Chat/Model/ChatMsgRemoteModel.swift b/yinmeng-ios/Modules/Chat/Model/ChatMsgRemoteModel.swift new file mode 100644 index 0000000..ca3cd1b --- /dev/null +++ b/yinmeng-ios/Modules/Chat/Model/ChatMsgRemoteModel.swift @@ -0,0 +1,16 @@ +// +// ChatMsgRemoteModel.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/23. +// + +import UIKit +import HandyJSON + +class ChatMsgRemoteModel: HandyJSON { + required init() { + + } + +} diff --git a/yinmeng-ios/Modules/Home/HomeVoiceUserInfoView.swift b/yinmeng-ios/Modules/Home/HomeVoiceUserInfoView.swift index cce03f5..c830225 100644 --- a/yinmeng-ios/Modules/Home/HomeVoiceUserInfoView.swift +++ b/yinmeng-ios/Modules/Home/HomeVoiceUserInfoView.swift @@ -140,6 +140,12 @@ class HomeVoiceUserInfoView: UIView { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + @objc func sendGiftBtnAction(){ + if let _clickBtnBlock = clickBtnBlock,let uid = self.user?.uid{ + _clickBtnBlock(5,"\(uid)") + self.removeFromSuperview() + } + } @objc func attentionBtnAction(){ if self.type == 1{ if let _clickBtnBlock = clickBtnBlock,let uid = self.model?.uid{ @@ -175,9 +181,10 @@ class HomeVoiceUserInfoView: UIView { if let _clickBtnBlock = clickBtnBlock, let uid = self.model?.uid{ _clickBtnBlock(0,"\(uid)") } - if let _clickBtnBlock = clickBtnBlock,let uid = self.user?.uid{ + if let _clickBtnBlock = clickBtnBlock, let uid = self.user?.uid{ _clickBtnBlock(0,"\(uid)") } + } @objc func playVoiceAction(){ guard let userVoice = self.model?.userVoice else { @@ -409,7 +416,7 @@ class HomeVoiceUserInfoView: UIView { _sendGfitBtn.titleLabel?.font = UIFont.systemFont(ofSize: 15, weight: .medium) _sendGfitBtn.setImage(UIImage(named: "yin_plane_star_send_gift_icon"), for: .selected) - _sendGfitBtn.addTarget(self, action: #selector(attentionBtnAction), for: .touchUpInside) + _sendGfitBtn.addTarget(self, action: #selector(sendGiftBtnAction), for: .touchUpInside) return _sendGfitBtn diff --git a/yinmeng-ios/Modules/Home/PlayVoiceManager.swift b/yinmeng-ios/Modules/Home/PlayVoiceManager.swift index b269df6..72e4412 100644 --- a/yinmeng-ios/Modules/Home/PlayVoiceManager.swift +++ b/yinmeng-ios/Modules/Home/PlayVoiceManager.swift @@ -90,7 +90,52 @@ class PlayVoiceManager: NSObject,AVAudioPlayerDelegate { downloadTask.resume() } - + static func downloadFile(url:String,complete:@escaping(_ url:String)->Void,fail:@escaping()->Void){ + let list = url.components(separatedBy: "/") + var name = "FileList" + if list.isEmpty == false,let getName = list.last{ + name = getName + } + let path = NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)[0] as String + let allPath = path + "/kUserFile/" + name + if FileManager.default.fileExists(atPath: allPath){ + complete(allPath) + }else{ + do { + try FileManager.default.createDirectory(atPath: allPath, withIntermediateDirectories: true, attributes: nil) + //请求 + let request = URLRequest(url: URL(string: url)!) + let session = URLSession.shared + //下载任务 + let downloadTask = session.downloadTask(with: request, + completionHandler: { (location:URL?, response:URLResponse?, error:Error?) + -> Void in + guard let locationPath = location?.path else{return} + + do { + if FileManager.default.fileExists(atPath: allPath){ + try FileManager.default.removeItem(atPath: allPath) + } + // 文件移动至document + try FileManager.default.copyItem(atPath: locationPath, toPath: allPath) + // main + DispatchQueue.main.async { + complete(allPath) + } + } catch let error { + fail() + } + }) + + + //使用resume方法启动任务 + downloadTask.resume() + }catch let error{ + fail() + } + + } + } diff --git a/yinmeng-ios/Modules/Room/Tool/YinRoomAudioManager.swift b/yinmeng-ios/Modules/Room/Tool/YinRoomAudioManager.swift index 59b9af7..0c278bc 100644 --- a/yinmeng-ios/Modules/Room/Tool/YinRoomAudioManager.swift +++ b/yinmeng-ios/Modules/Room/Tool/YinRoomAudioManager.swift @@ -7,25 +7,20 @@ import UIKit -enum YinRoomAudMioanagerType { +enum YinRoomAudioManagerType { case trtc,agora } -class YinRoomAudMioanager: NSObject { - static let share = YinRoomAudMioanager() - var type:YinRoomAudMioanagerType = .trtc - - +class YinRoomAudioManager: NSObject { + static let share = YinRoomAudioManager() + var type:YinRoomAudioManagerType = .trtc func dealWithChatData(roomData:RoomDataModel){ type = roomData.audioSdkType == "trtc" ? .trtc : .agora if type == .trtc{ roomTRTCManager.roomData = roomData roomTRTCManager.setTRTC() }else{ - - agoraManager.initAgora(roomUid: roomData.roomId) - - + agoraManager.initAgora(roomUid: roomData.roomId) } } diff --git a/yinmeng-ios/Modules/Room/Tool/YinRoomTRTCManager.swift b/yinmeng-ios/Modules/Room/Tool/YinRoomTRTCManager.swift index add2d60..9bc3a41 100644 --- a/yinmeng-ios/Modules/Room/Tool/YinRoomTRTCManager.swift +++ b/yinmeng-ios/Modules/Room/Tool/YinRoomTRTCManager.swift @@ -33,12 +33,11 @@ class YinRoomTRTCManager: NSObject { cloud.enableAudioVolumeEvaluation(true, with: params) let yinParams = TRTCParams() if AuthViewModel.authVM.appId.isEmpty{ - yinParams.sdkAppId = UInt32("1400798783") ?? 0 }else{ yinParams.sdkAppId = UInt32(AuthViewModel.authVM.appId) ?? 0 } - yinParams.roomId = UInt32(curRoomId) ?? 0 + yinParams.roomId = UInt32(curRoomId) ?? 0 let uid = "\(AuthManager.userUid)" yinParams.userId = uid let sign = self.roomData?.trtcSig ?? "" diff --git a/yinmeng-ios/Modules/Room/VC/RoomVC.swift b/yinmeng-ios/Modules/Room/VC/RoomVC.swift index fcbaf6e..ec5f89f 100644 --- a/yinmeng-ios/Modules/Room/VC/RoomVC.swift +++ b/yinmeng-ios/Modules/Room/VC/RoomVC.swift @@ -13,7 +13,7 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol { self.roomUid = roomUid } deinit { - YinRoomAudMioanager.share.destroySharedIntance() + YinRoomAudioManager.share.destroySharedIntance() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") @@ -24,33 +24,100 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol { requestData() addNIMSDKManager() addChild(chatListVC) - menuView.clickMenuViewBlcok = {[weak self] in + menuView.clickMenuViewBlcok = {[weak self] type in guard let self = self else { return} - self.view.addSubview(self.bgChatView) - self.bgChatView.snp.makeConstraints { make in - make.edges.equalTo(self.view) - } - let height = ScreenHeight * 2 / 3 - self.view.addSubview(self.chatListVC.view) - self.chatListVC.view.layer.cornerRadius = 20 - self.chatListVC.view.layer.masksToBounds = true - self.chatListVC.view.frame = CGRect(x: 0, y: ScreenHeight, width: ScreenWidth, height: height) - UIView.animate(withDuration: 0.1) { - self.chatListVC.view.frame = CGRect(x: 0, y:ScreenHeight - height, width: ScreenWidth, height: height) + if type == .chat{ + self.view.addSubview(self.bgChatView) + self.bgChatView.snp.makeConstraints { make in + make.edges.equalTo(self.view) + } + let height = ScreenHeight * 2 / 3 + self.view.addSubview(self.chatListVC.view) + self.chatListVC.view.layer.cornerRadius = 20 + self.chatListVC.view.layer.masksToBounds = true + self.chatListVC.view.frame = CGRect(x: 0, y: ScreenHeight, width: ScreenWidth, height: height) + UIView.animate(withDuration: 0.1) { + self.chatListVC.view.frame = CGRect(x: 0, y:ScreenHeight - height, width: ScreenWidth, height: height) + } + }else{ + let sendGiftVC = SendGiftVC() + let nav = BaseNavigationViewController.init(rootViewController: sendGiftVC) + nav.modalPresentationStyle = .overCurrentContext + let list = micSeatView.getMicUser() + var userList:[SendGiftUserModel] = [] + for item:[String:UserObject] in list { + + + if let first = item.keys.first,let user = item[first],let uid = user.uid,uid != AuthManager.userUid{ + let model = SendGiftUserModel() + model.position = first + model.nick = user.nick ?? "" + model.avatar = user.avatar ?? "" + model.uid = user.uid ?? 0 + userList.append(model) + + } + + } + sendGiftVC.userList = userList + sendGiftVC.roomUid = self.roomUid + sendGiftVC.roomId = self.roomInfo?.roomId ?? "" + sendGiftVC.userData = self.userData + self.present(nav, animated: true, completion: nil) } + + } + micSeatView.showUserInfoBlock = {[weak self] user in + guard let weakSelf = self else { return } + let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero) + userInfoView.clickBtnBlock = {[weak self] (type,uid) in + guard let weakSelf = self else { + return + } + if type == 0{ + let session = NIMSession(uid, type: .P2P) + let chatVC = ChatVC.init(session: session) + weakSelf.navigationController?.pushViewController(chatVC, animated: true) + }else if (type == 5){ + if let first = user.keys.first,let userModel = user[first],let uid = userModel.uid,uid != AuthManager.userUid{ + var userList:[SendGiftUserModel] = [] + let model = SendGiftUserModel() + model.position = first + model.nick = userModel.nick ?? "" + model.avatar = userModel.avatar ?? "" + model.uid = userModel.uid ?? 0 + userList.append(model) + let sendGiftVC = SendGiftVC() + let nav = BaseNavigationViewController.init(rootViewController: sendGiftVC) + nav.modalPresentationStyle = .overCurrentContext + sendGiftVC.userList = userList + sendGiftVC.roomUid = weakSelf.roomUid + sendGiftVC.roomId = weakSelf.roomInfo?.roomId ?? "" + sendGiftVC.userData = weakSelf.userData + sendGiftVC.isSendPerson = true + weakSelf.present(nav, animated: true, completion: nil) + } + } + + } + userInfoView.type = 2 + userInfoView.user = user.values.first + weakSelf.view.addSubview(userInfoView) + userInfoView.snp.makeConstraints { make in + make.edges.equalTo(weakSelf.view) + } } - topView.didClickTypeBlcok = {[weak self] (type,uid) in guard let self = self else { return} if type == 0{ - YinRoomAudMioanager.share.exitRoom() + YinRoomAudioManager.share.exitRoom() RoomVCViewModel.roomVM.isMute = true NIMSDK.shared().chatroomManager.exitChatroom(self.roomInfo?.roomId ?? "") self.dismiss(animated: true, completion: nil) }else if type == 1 { - YinRoomAudMioanager.share.exitRoom() + YinRoomAudioManager.share.exitRoom() RoomVCViewModel.roomVM.isMute = true NIMSDK.shared().chatroomManager.exitChatroom(self.roomInfo?.roomId ?? "") self.dismiss(animated: true, completion: nil) @@ -84,6 +151,7 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol { view.addSubview(micSeatView) view.addSubview(chatScreenView) view.addSubview(menuView) + view.addSubview(roomEffectView) backgroundView.snp.makeConstraints { make in make.edges.equalTo(self.view) } @@ -108,27 +176,10 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol { make.bottom.equalTo(-bottom) make.height.equalTo(UIDevice.scaleWidth(width: 40)) } - micSeatView.showUserInfoBlock = {[weak self] user in - guard let weakSelf = self else { return } - let userInfoView:HomeVoiceUserInfoView = HomeVoiceUserInfoView.init(frame: .zero) - userInfoView.clickBtnBlock = {[weak self] (type,uid) in - guard let weakSelf = self else { - return - } - if type == 0{ - let session = NIMSession(uid, type: .P2P) - let chatVC = ChatVC.init(session: session) - weakSelf.navigationController?.pushViewController(chatVC, animated: true) - } - - } - userInfoView.type = 2 - userInfoView.user = user - weakSelf.view.addSubview(userInfoView) - userInfoView.snp.makeConstraints { make in - make.edges.equalTo(weakSelf.view) - } + roomEffectView.snp.makeConstraints { make in + make.edges.equalTo(view) } + } private func requestData(){ @@ -143,6 +194,7 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol { RoomVCViewModel.roomVM.NIMSDKEnterRoom(roomId:roomid , user: result) self?.micSeatView.userData = result self?.menuView.user = result + self?.userData = result } }).disposed(by: rx.disposeBag) @@ -160,7 +212,7 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol { topView.roomData = self.roomInfo micSeatView.roomData = self.roomInfo if let roomInfo = self.roomInfo{ - YinRoomAudMioanager.share.dealWithChatData(roomData:roomInfo) + YinRoomAudioManager.share.dealWithChatData(roomData:roomInfo) } micSeatView.setMicList() menuView.roomUid = self.roomInfo?.roomId ?? "" @@ -192,6 +244,7 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol { var roomUid:String = "" var roomText:String = "" var roomInfo:RoomDataModel? + var userData:UserObject? //MARK: - 懒加载 private lazy var backgroundView:RoomBackgroundView = { let _backgroundView = RoomBackgroundView(frame: .zero) @@ -229,6 +282,11 @@ class RoomVC: BaseViewController, HiddenNavigationBarProtocol { return _chatListVC }() + private lazy var roomEffectView:RoomDynamicEffectView = { + let _roomEffectView = RoomDynamicEffectView(frame: .zero) + _roomEffectView.isUserInteractionEnabled = false + return _roomEffectView + }() } @@ -266,6 +324,9 @@ extension RoomVC : NIMChatManagerDelegate, NIMChatroomManagerDelegate, NIMLoginM self.topView.roomData = self.roomInfo }else if msg.messageType == .text{ chatScreenView.getTextMsg(msg: msg) + }else if msg.messageType == .custom{ + chatScreenView.dealWithCustomMsg(msg: msg) + roomEffectView.dealWithCustomMsg(msg: msg) } micSeatView.dealWithNotMessage(msg: msg) menuView.dealWithNotMessage(msg: msg) @@ -278,6 +339,9 @@ extension RoomVC : NIMChatManagerDelegate, NIMChatroomManagerDelegate, NIMLoginM } if message.messageType == .text{ chatScreenView.getTextMsg(msg: message) + }else if message.messageType == .custom{ + chatScreenView.dealWithCustomMsg(msg: message) + roomEffectView.dealWithCustomMsg(msg: message) } } func updateOnlineNum(num:Int){ diff --git a/yinmeng-ios/Modules/Room/View/MicSeatView/View/MicSeatSuperView/NormalMicSeatSuperView.swift b/yinmeng-ios/Modules/Room/View/MicSeatView/View/MicSeatSuperView/NormalMicSeatSuperView.swift index 203a906..a5b8eaf 100644 --- a/yinmeng-ios/Modules/Room/View/MicSeatView/View/MicSeatSuperView/NormalMicSeatSuperView.swift +++ b/yinmeng-ios/Modules/Room/View/MicSeatView/View/MicSeatSuperView/NormalMicSeatSuperView.swift @@ -10,7 +10,7 @@ import NIMSDK import MJExtension -typealias ShowUserInfoBlock = (_ user:UserObject)->Void +typealias ShowUserInfoBlock = (_ user:[String:UserObject])->Void class NormalMicSeatSuperView: MicSeatSuperView { var showUserInfoBlock:ShowUserInfoBlock? @@ -29,7 +29,7 @@ class NormalMicSeatSuperView: MicSeatSuperView { if let userInfo = not.userInfo as? [NSString:Any],let type = userInfo["type"] as? String{ var uidList:[String] = [] - if let userVolumes: [TRTCVolumeInfo] = userInfo["userVolumes"] as? [TRTCVolumeInfo],let totalVolume = userInfo["totalVolume"] as? Int ,type == "trtc"{ + if let userVolumes: [TRTCVolumeInfo] = userInfo["userVolumes"] as? [TRTCVolumeInfo],type == "trtc"{ for item in userVolumes { @@ -142,7 +142,9 @@ class NormalMicSeatSuperView: MicSeatSuperView { return } - HUDTool.show(with: "该麦位已经有人了哦~") + if let showUserInfoBlock = self.showUserInfoBlock,let user = roomOwnerView.user{ + showUserInfoBlock(["-1":user]) + } return } @@ -200,6 +202,21 @@ class NormalMicSeatSuperView: MicSeatSuperView { } } + func getMicUser()->[[String:UserObject]]{ + var list:[[String:UserObject]] = [] + if let user = roomOwnerView.user{ + + list.append(["-1":user]) + } + for i in 0..<8 { + if let cell = collectionView.cellForItem(at: IndexPath(row: i, section: 0)) as? NormalMicSeatCell{ + if let user = cell.user{ + list.append(["\(i)":user]) + } + } + } + return list + } //MARK: - 懒加载 var roomUserList:[MicSequenceModel] = [] var roomData:RoomDataModel? @@ -275,7 +292,7 @@ extension NormalMicSeatSuperView:UICollectionViewDelegate,UICollectionViewDataSo return } if let showUserInfoBlock = self.showUserInfoBlock,let user = user.user{ - showUserInfoBlock(user) + showUserInfoBlock(["\(indexPath.row)":user]) } }else{ diff --git a/yinmeng-ios/Modules/Room/View/RoomChatScreenView/Model/RoomMsgListModel.swift b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/Model/RoomMsgListModel.swift index 00e81ab..ea6e166 100644 --- a/yinmeng-ios/Modules/Room/View/RoomChatScreenView/Model/RoomMsgListModel.swift +++ b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/Model/RoomMsgListModel.swift @@ -24,4 +24,6 @@ struct RoomMsgListModel: HandyJSON { var text = "" var avatar = "" var height:CGFloat = 0 + var isGift = false + var att:NSMutableAttributedString? } diff --git a/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenContentCell.swift b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenContentCell.swift new file mode 100644 index 0000000..d441d17 --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenContentCell.swift @@ -0,0 +1,71 @@ +// +// RoomChatScreenContentCell.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/23. +// + +import UIKit + +class RoomChatScreenContentCell: UITableViewCell { + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setUILayout() + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + var textAtt:NSMutableAttributedString? = nil{ + didSet{ + guard let _textAtt = textAtt else { return } + textView.attributedText = _textAtt + } + } + + private func setUILayout(){ + selectionStyle = .none + backgroundColor = .clear + contentView.addSubview(bgImageView) + contentView.addSubview(textView) + let width = ScreenWidth - UIDevice.scaleWidth(width: 148) + bgImageView.snp.makeConstraints { make in + make.leading.trailing.top.equalTo(contentView) + make.bottom.equalTo(-UIDevice.scaleWidth(width: 10)) + + } + textView.snp.makeConstraints { make in + make.leading.equalTo(UIDevice.scaleWidth(width: 12)) + make.trailing.top.bottom.equalTo(bgImageView).inset(UIDevice.scaleWidth(width: 10)) + } + } + + //MARK: - 懒加载 + private lazy var bgImageView:UIImageView = { + let _bgImageView = UIImageView() + _bgImageView.layer.cornerRadius = UIDevice.scaleWidth(width: 7) + _bgImageView.isUserInteractionEnabled = true + _bgImageView.layer.masksToBounds = true + let image = UIImage.image(color: ThemeColor(hexStr: "#FFFFFF", alpha: 0.15)) + _bgImageView.image = image + return _bgImageView + }() + private lazy var textView:YYLabel = { + let _textView = YYLabel() + _textView.numberOfLines = 0 + return _textView + }() + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenUserChatCell.swift b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenUserChatCell.swift index 7797557..fb8857f 100644 --- a/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenUserChatCell.swift +++ b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenUserChatCell.swift @@ -70,10 +70,10 @@ class RoomChatScreenUserChatCell: UITableViewCell { } let width = ScreenWidth - UIDevice.scaleWidth(width: 148) bgTextView.snp.makeConstraints { make in - make.top.equalTo(tagStackView.snp.bottom).offset(UIDevice.scaleWidth(width: 6)) + make.top.equalTo(UIDevice.scaleWidth(width: 50)) make.leading.equalTo(tagStackView) make.width.lessThanOrEqualTo(width) - make.height.greaterThanOrEqualTo(10) + make.bottom.equalTo(-UIDevice.scaleWidth(width: 10)) } textView.snp.makeConstraints { make in diff --git a/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenView.swift b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenView.swift index fbf25b5..b33225e 100644 --- a/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenView.swift +++ b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/View/RoomChatScreenView.swift @@ -40,6 +40,107 @@ class RoomChatScreenView: UIView { } } + + + + private func setUILayout(){ + addSubview(chatTableView) + chatTableView.snp.makeConstraints { make in + make.leading.equalTo(UIDevice.scaleWidth(width: 15)) + make.top.bottom.right.equalTo(self) + } + + } + private func registerCell(){ + chatTableView.delegate = self + chatTableView.dataSource = self + chatTableView.tableHeaderView = tableHeaderView + chatTableView.register(RoomChatScreenUserChatCell.self, forCellReuseIdentifier: "RoomChatScreenUserChatCell") + chatTableView.register(RoomChatScreenContentCell.self, forCellReuseIdentifier: "RoomChatScreenContentCell") + } + + + //MARK: - 懒加载 + var roomId = "" + var msgList:[RoomMsgListModel] = [] + private lazy var chatTableView:UITableView = { + let _chatTableView = UITableView(frame: .zero, style: .plain) + _chatTableView.tableFooterView = UIView() + _chatTableView.separatorStyle = .none + _chatTableView.backgroundColor = .clear + _chatTableView.showsVerticalScrollIndicator = false + _chatTableView.tag = 888 + + + return _chatTableView + }() + private lazy var tableHeaderView:RoomChatScreenHeaderView = { + let _tableHeaderView = RoomChatScreenHeaderView(frame: .zero) + + return _tableHeaderView + }() + private lazy var chatManager:RoomChatScreenManager = { + let _chatManager = RoomChatScreenManager() + + return _chatManager + }() +} +extension RoomChatScreenView:UITableViewDelegate,UITableViewDataSource{ + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return msgList.count + } + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { +// let model = msgList[indexPath.row] +// return model.height + return UITableView.automaticDimension + } + func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { + return 100 + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let model = msgList[safe: indexPath.row] + if let _model = model, _model.isGift == true { + let cell = tableView.dequeueReusableCell(withIdentifier: "RoomChatScreenContentCell", for: indexPath) as! RoomChatScreenContentCell + cell.textAtt = _model.att + return cell + } + let cell = tableView.dequeueReusableCell(withIdentifier: "RoomChatScreenUserChatCell", for: indexPath) as! RoomChatScreenUserChatCell + + cell.model = model + return cell + } + + func isAddMsg(msg:NIMMessage)->Bool{ + if let obj = msg.messageObject as? NIMCustomObject,let customObj = obj.attachment as? ChatCustomMsgModel{ + if customObj.first == 3 || customObj.first == 12{ + return true + } + } + return false + + } + func dealWithCustomMsg(msg:NIMMessage){ + guard isAddMsg(msg: msg) else { return } + if let obj = msg.messageObject as? NIMCustomObject,let customObj = obj.attachment as? ChatCustomMsgModel{ + if customObj.first == 3{ + let att = chatManager.getSendGfitAtt(model: customObj, sendText: " 送给 ") + var model = RoomMsgListModel() + model.isGift = true + model.att = att + msgList.append(model) + chatTableView.reloadData() + }else if customObj.first == 12{ + let att = chatManager.getSendAllGfitAtt(model: customObj, sendText: " 全麦送出 ") + var model = RoomMsgListModel() + model.isGift = true + model.att = att + msgList.append(model) + chatTableView.reloadData() + } + + } + + } func getTextMsg(msg:NIMMessage){ dealWithMsg(msg: msg) chatTableView.reloadData() @@ -81,56 +182,4 @@ class RoomChatScreenView: UIView { self.msgList.append(model) } - var roomId = "" - private func setUILayout(){ - addSubview(chatTableView) - chatTableView.snp.makeConstraints { make in - make.leading.equalTo(UIDevice.scaleWidth(width: 15)) - make.top.bottom.right.equalTo(self) - } - - } - private func registerCell(){ - chatTableView.delegate = self - chatTableView.dataSource = self - chatTableView.tableHeaderView = tableHeaderView - chatTableView.register(RoomChatScreenUserChatCell.self, forCellReuseIdentifier: "RoomChatScreenUserChatCell") - } - - - var msgList:[RoomMsgListModel] = [] - //MARK: - 懒加载 - private lazy var chatTableView:UITableView = { - let _chatTableView = UITableView(frame: .zero, style: .plain) - _chatTableView.tableFooterView = UIView() - _chatTableView.separatorStyle = .none - _chatTableView.backgroundColor = .clear - _chatTableView.showsVerticalScrollIndicator = false - _chatTableView.tag = 888 - - - return _chatTableView - }() - private lazy var tableHeaderView:RoomChatScreenHeaderView = { - let _tableHeaderView = RoomChatScreenHeaderView(frame: .zero) - - return _tableHeaderView - }() -} -extension RoomChatScreenView:UITableViewDelegate,UITableViewDataSource{ - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return msgList.count - } - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - let model = msgList[indexPath.row] - return model.height - } - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "RoomChatScreenUserChatCell", for: indexPath) as! RoomChatScreenUserChatCell - let model = msgList[indexPath.row] - cell.model = model - return cell - } - - } diff --git a/yinmeng-ios/Modules/Room/View/RoomChatScreenView/ViewModel/RoomChatScreenManager.swift b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/ViewModel/RoomChatScreenManager.swift new file mode 100644 index 0000000..69fe1ab --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/RoomChatScreenView/ViewModel/RoomChatScreenManager.swift @@ -0,0 +1,92 @@ +// +// RoomChatScreenManager.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/23. +// + +import UIKit +import Nuke + +class RoomChatScreenManager: NSObject { + + func getSendGfitAtt(model:ChatCustomMsgModel,sendText:String)->NSMutableAttributedString?{ + + if let model = Deserialized.toModel(with: model.data) { + let giftData = model.gift == nil ? model.giftInfo : model.gift + let giftUrl = giftData?.giftUrl ?? "" + + let att = NSMutableAttributedString() + att.append(getTextAtt(text: model.nick, color: ThemeColor(hexStr: "#FFD98C"), font: 12)) + att.append(getPlaceholderAtt(width: 2)) + att.append(getTextAtt(text: sendText, color: ThemeColor(hexStr: "#fffffe",alpha: 0.5), font: 12)) + att.append(getPlaceholderAtt(width: 2)) + att.append(getTextAtt(text: model.targetNick, color: ThemeColor(hexStr: "#FFD98C"), font: 12)) + att.append(getPlaceholderAtt(width: 2)) + att.append(getImageAtt(url: giftUrl)) + att.append(getPlaceholderAtt(width: 2)) + att.append(getTextAtt(text: "X\(model.giftNum)", color: .white, font: 12)) + return att + } + return nil + } + func getSendAllGfitAtt(model:ChatCustomMsgModel,sendText:String)->NSMutableAttributedString?{ + + if let model = Deserialized.toModel(with: model.data) { + let giftData = model.gift == nil ? model.giftInfo : model.gift + let giftUrl = giftData?.giftUrl ?? "" + + let att = NSMutableAttributedString() + att.append(getTextAtt(text: model.nick, color: ThemeColor(hexStr: "#FFD98C"), font: 12)) + att.append(getPlaceholderAtt(width: 2)) + att.append(getTextAtt(text: sendText, color: ThemeColor(hexStr: "#fffffe",alpha: 0.5), font: 12)) + att.append(getPlaceholderAtt(width: 2)) + att.append(getImageAtt(url: giftUrl)) + att.append(getPlaceholderAtt(width: 2)) + att.append(getTextAtt(text: "X\(model.giftNum)", color: .white, font: 12)) + return att + } + return nil + } + func getPlaceholderAtt(width:CGFloat)->NSMutableAttributedString{ + let placeholderView = UIView() + placeholderView.backgroundColor = .clear + let width = placeholderView.bounds.size.width + let height = placeholderView.bounds.size.height + placeholderView.bounds = CGRect(x: 0, y: 0, width: UIDevice.scaleWidth(width: width), height: UIDevice.scaleWidth(width: 10)) + let att = NSMutableAttributedString.yy_attachmentString(withContent: placeholderView, contentMode: .scaleAspectFit, attachmentSize: CGSize(width: width, height: height), alignTo: UIFont.getScaleFont(ofSize: 15, weight: .regular), alignment: .center) + return att + } + func getTextAtt(text:String,color:UIColor,font:CGFloat)->NSMutableAttributedString{ + let att = NSMutableAttributedString(string: text) + att.yy_font = UIFont.getScaleFont(ofSize: font, weight: .regular) + att.yy_color = color + att.yy_paragraphStyle = getParagraphStyle() + return att + } + func getParagraphStyle()->NSMutableParagraphStyle{ + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = UIDevice.scaleWidth(width: 4) + paragraphStyle.alignment = .left + paragraphStyle.baseWritingDirection = .leftToRight + return paragraphStyle + } + func getImageAtt(url:String)->NSMutableAttributedString{ + let imageView = UIImageView() + Nuke.loadImage(with: url, into: imageView, completion: nil) + + var bounds = CGRect(x: 0, y: 0, width:UIDevice.scaleWidth(width: 16) , height: UIDevice.scaleWidth(width: 16)) + if let image = imageView.image { + let scale = image.size.width / (image.size.height == 0 ? 1 : image.size.height) + bounds = CGRect(x: 0, y: 0, width:UIDevice.scaleWidth(width: 16) * scale , height: UIDevice.scaleWidth(width: 16)) + + } + imageView.bounds = bounds + imageView.layer.masksToBounds = true + imageView.contentMode = .scaleAspectFit + let width = imageView.bounds.size.width + let height = imageView.bounds.size.height + let att = NSMutableAttributedString.yy_attachmentString(withContent: imageView, contentMode: .scaleAspectFit, attachmentSize: CGSize(width:width , height: height), alignTo: UIFont.getScaleFont(ofSize: 15, weight: .regular), alignment: .center) + return att + } +} diff --git a/yinmeng-ios/Modules/Room/View/RoomDynamicEffectView/View/RoomDynamicEffectView.swift b/yinmeng-ios/Modules/Room/View/RoomDynamicEffectView/View/RoomDynamicEffectView.swift new file mode 100644 index 0000000..27e4e2c --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/RoomDynamicEffectView/View/RoomDynamicEffectView.swift @@ -0,0 +1,169 @@ +// +// RoomDynamicEffectView.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/23. +// + +import UIKit + + +class RoomDynamicEffectView: UIView{ + + override init(frame: CGRect) { + super.init(frame: frame) + setUILayout() + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + private func setUILayout(){ + addSubview(vapView) + addSubview(svgaView) + vapView.snp.makeConstraints { make in + make.edges.equalTo(self) + } + svgaView.snp.makeConstraints { make in + make.edges.equalTo(self) + } + } + //MARK: - 懒加载 + var giftList:[RectiveGiftModel] = [] + var isPlay:Bool = false + private lazy var vapView:UIView = { + let _vapView = UIView() + _vapView.backgroundColor = ThemeColor(hexStr: "#000000", alpha: 0.5) + _vapView.isUserInteractionEnabled = true + _vapView.contentMode = .scaleAspectFill + _vapView.isHidden = true + return _vapView + }() + private lazy var svgaView:SVGAImageView = { + let _svgaView = SVGAImageView() + _svgaView.backgroundColor = ThemeColor(hexStr: "#000000", alpha: 0.5) + _svgaView.isUserInteractionEnabled = true + _svgaView.delegate = self + _svgaView.isHidden = true + return _svgaView + }() + private lazy var svgaParser:SVGAParser = { + let _svgaParser = SVGAParser() + + return _svgaParser + }() + +} + +extension RoomDynamicEffectView:SVGAPlayerDelegate,HWDMP4PlayDelegate { + func viewDidFinishPlayMP4(_ totalFrameCount: Int, view container: UIView!) { + DispatchQueue.main.async { + self.playEffect() + } + + } + func svgaPlayerDidFinishedAnimation(_ player: SVGAPlayer!) { + playEffect() + } + func playSvgaEffect(model:RectiveGiftModel){ + guard let gift = model.gift == nil ? model.giftInfo : model.gift else { return } + if let url = URL(string: gift.vggUrl){ + svgaView.isHidden = false + svgaParser.parse(with: url) { item in + if let _item = item{ + let width = _item.videoSize.width + let height = _item.videoSize.height + if width > height{ + self.svgaView.contentMode = .scaleAspectFit + }else{ + let h = ScreenWidth * height / width + self.svgaView.contentMode = h > ScreenHeight ? .scaleAspectFill : .scaleAspectFit + } + self.svgaView.loops = 1 + self.svgaView.clearsAfterStop = true + self.svgaView.videoItem = item + self.svgaView.startAnimation() + + return + } + + self.isPlay = false + self.svgaView.isHidden = true + } + return + } + isPlay = false + svgaView.isHidden = true + } + func playMp4Effect(model:RectiveGiftModel){ + if let gift = model.gift == nil ? model.giftInfo : model.gift{ + PlayVoiceManager.downloadFile(url: gift.viewUrl) { url in + self.vapView.isHidden = false + self.vapView.setMute(true) + self.vapView.playHWDMP4(url, repeatCount: 1, delegate: self) + }fail: { + self.isPlay = false + self.vapView.isHidden = true + } + } + + } + func playEffect(){ + if !giftList.isEmpty{ + giftList.removeFirst() + } + if !giftList.isEmpty{ + guard let model = giftList.first, let gift = model.gift == nil ? model.giftInfo : model.gift else { + isPlay = false + vapView.isHidden = true + svgaView.isHidden = true + return + } + if !gift.vggUrl.isEmpty{ + giftList.append(model) + if isPlay == false{ + isPlay = true + playSvgaEffect(model: model) + } + }else if !gift.viewUrl.isEmpty{ + giftList.append(model) + if isPlay == false{ + isPlay = true + playMp4Effect(model: model) + } + } + return + } + isPlay = false + vapView.isHidden = true + svgaView.isHidden = true + } + func dealWithCustomMsg(msg:NIMMessage){ + + if let obj = msg.messageObject as? NIMCustomObject,let customObj = obj.attachment as? ChatCustomMsgModel{ + if customObj.first == 3 || customObj.first == 12{ + if let model = Deserialized.toModel(with: customObj.data),let gift = model.gift == nil ? model.giftInfo : model.gift { + + + if !gift.vggUrl.isEmpty{ + giftList.append(model) + if isPlay == false{ + isPlay = true + playSvgaEffect(model: model) + } + }else if !gift.viewUrl.isEmpty{ + giftList.append(model) + if isPlay == false{ + isPlay = true + playMp4Effect(model: model) + } + } + + } + } + + } + + } +} diff --git a/yinmeng-ios/Modules/Room/View/RoomMenuView/View/RoomMenuView.swift b/yinmeng-ios/Modules/Room/View/RoomMenuView/View/RoomMenuView.swift index 4f37a1f..79245e5 100644 --- a/yinmeng-ios/Modules/Room/View/RoomMenuView/View/RoomMenuView.swift +++ b/yinmeng-ios/Modules/Room/View/RoomMenuView/View/RoomMenuView.swift @@ -7,8 +7,10 @@ import UIKit import NIMSDK -typealias ClickMenuViewBlcok = () -> Void - +typealias ClickMenuViewBlcok = (_ type:RoomMenuType) -> Void +enum RoomMenuType { +case chat,sendGift +} class RoomMenuView: UIView { @@ -59,18 +61,23 @@ class RoomMenuView: UIView { } @objc func clickChatViewAction(){ if let _clickMenuViewBlcok = clickMenuViewBlcok{ - _clickMenuViewBlcok() + _clickMenuViewBlcok(.chat) } } + @objc func clickSendGiftAction(){ + if let _clickMenuViewBlcok = clickMenuViewBlcok{ + _clickMenuViewBlcok(.sendGift) + } + } @objc func clickMicBtnAction(){ micBtn.isSelected = !micBtn.isSelected if micBtn.isSelected { - YinRoomAudMioanager.share.muteLocalAudio(mute: true) + YinRoomAudioManager.share.muteLocalAudio(mute: true) RoomVCViewModel.roomVM.isMute = true return } - YinRoomAudMioanager.share.muteLocalAudio(mute: false) + YinRoomAudioManager.share.muteLocalAudio(mute: false) RoomVCViewModel.roomVM.isMute = false } @@ -91,14 +98,14 @@ class RoomMenuView: UIView { micBtn.isHidden = false micBtn.isSelected = true isHaveChange = true - YinRoomAudMioanager.share.muteLocalAudio(mute: true) + YinRoomAudioManager.share.muteLocalAudio(mute: true) RoomVCViewModel.roomVM.isMute = true } }else if changeType == 2{ if AuthManager.userUid == userData.uid{ micBtn.isHidden = true - YinRoomAudMioanager.share.muteLocalAudio(mute: true) + YinRoomAudioManager.share.muteLocalAudio(mute: true) RoomVCViewModel.roomVM.isMute = true } } @@ -106,7 +113,7 @@ class RoomMenuView: UIView { } if isHaveChange{ - YinRoomAudMioanager.share.setBroadcast(isChange: isHaveChange) + YinRoomAudioManager.share.setBroadcast(isChange: isHaveChange) } @@ -161,6 +168,7 @@ class RoomMenuView: UIView { private lazy var sendGiftBtn :UIButton = { let _sendGiftBtn = UIButton() _sendGiftBtn.setImage(UIImage(named: "room_send_gift_icon"), for: .normal) + _sendGiftBtn.addTarget(self, action: #selector(clickSendGiftAction), for: .touchUpInside) return _sendGiftBtn }() } diff --git a/yinmeng-ios/Modules/Room/View/RoomMenuView/View/RoomSendTextView.swift b/yinmeng-ios/Modules/Room/View/RoomMenuView/View/RoomSendTextView.swift index 9fd6672..1a1337a 100644 --- a/yinmeng-ios/Modules/Room/View/RoomMenuView/View/RoomSendTextView.swift +++ b/yinmeng-ios/Modules/Room/View/RoomMenuView/View/RoomSendTextView.swift @@ -8,8 +8,10 @@ import UIKit import NIMSDK -class RoomSendTextView: UIView { +typealias SendGiftNumBlock = (_ text:String) -> Void +class RoomSendTextView: UIView { + var sendGiftNumBlock:SendGiftNumBlock? override init(frame: CGRect) { super.init(frame: frame) setUILayout() @@ -66,7 +68,22 @@ class RoomSendTextView: UIView { } @objc func sendTextAction(){ + if isSendGiftNum { + if let _sendGiftNumBlock = self.sendGiftNumBlock{ + if let text = textFiled.text,text.isEmpty{ + HUDTool.show(with: "请输入礼物数量") + return + } + _sendGiftNumBlock(self.textFiled.text ?? "") + textFiled.resignFirstResponder() + textFiled.text = "" + } + return + } guard let user = self.user else { return } + + + let msg = NIMMessage() msg.text = textFiled.text let ext = ["\(AuthManager.userUid)":["erbanNo":"\(user.erbanNo ?? 0)","charmUrl":user.userLevelVo?.charmUrl,"experUrl":user.userLevelVo?.experUrl]] @@ -82,6 +99,14 @@ class RoomSendTextView: UIView { } @objc func textFieldEditChanged(textField:UITextField){ + if isSendGiftNum { + if let text = textField.text,text.count > 0{ + if Int(text) ?? 0 > 9999{ + textField.text = "9999" + } + } + return + } guard let text = textField.text else { sendTextBtn.isEnabled = false return @@ -91,6 +116,15 @@ class RoomSendTextView: UIView { //MARK: - 懒加载 var user:UserObject? var roomUid = "" + var isSendGiftNum:Bool = false { + didSet{ + sendTextBtn.isEnabled = true + + let textAtt = NSAttributedString(string: "请输入赠送数额", attributes: [.font:UIFont.getScaleFont(ofSize: 15, weight: .regular),.foregroundColor:ThemeColor(hexStr: "#878B9C")]) + textFiled.attributedPlaceholder = textAtt + sendTextBtn.setTitle("确认", for: .normal) + } + } lazy var textFiled:UITextField = { let _textFiled = UITextField() let textAtt = NSAttributedString(string: "请输入消息...", attributes: [.font:UIFont.getScaleFont(ofSize: 15, weight: .regular),.foregroundColor:ThemeColor(hexStr: "#878B9C")]) @@ -122,7 +156,30 @@ class RoomSendTextView: UIView { } extension RoomSendTextView:UITextFieldDelegate{ func textFieldShouldReturn(_ textField: UITextField) -> Bool { + + textField.resignFirstResponder() return true } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + if self.isSendGiftNum{ + let length = string.lengthOfBytes(using: String.Encoding.utf8) + for loopIndex in 0.. 57 { + return false + } + + } + + + } + + + return true + } } diff --git a/yinmeng-ios/Modules/Room/View/RoomTopView/View/YinRoomRankItemView.swift b/yinmeng-ios/Modules/Room/View/RoomTopView/View/YinRoomRankItemView.swift index 695f50c..11f0ff7 100644 --- a/yinmeng-ios/Modules/Room/View/RoomTopView/View/YinRoomRankItemView.swift +++ b/yinmeng-ios/Modules/Room/View/RoomTopView/View/YinRoomRankItemView.swift @@ -57,7 +57,7 @@ class YinRoomRankItemView: UIView { let amount = _model.goldAmount var text = "\(amount)" if amount >= 10000{ - text = String(format: "%.1fw", amount / 10000) + text = String(format: "%.1fw", Double(amount) / 10000.0) } numView.text = text } diff --git a/yinmeng-ios/Modules/Room/View/SendGift/Model/RectiveGiftModel.swift b/yinmeng-ios/Modules/Room/View/SendGift/Model/RectiveGiftModel.swift new file mode 100644 index 0000000..93f98f9 --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/Model/RectiveGiftModel.swift @@ -0,0 +1,40 @@ +// +// RectiveGiftModel.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/23. +// + +import UIKit +import HandyJSON +class RectiveGiftModel: HandyJSON{ + required init(){ + + } + var targetUid = "" + + var targetAvatar = "" + var targetNick = "" + var targetUids:[String] = [] + + var gift:SendGiftModel? + + var giftInfo:SendGiftModel? + + var uid = "" + + var giftId = "" + + var nick = "" + + var avatar = "" + var giftNum = 0 + var giftName = "" + var vggUrl = "" + var viewUrl = "" + var targetUsers:[RectiveGiftUserModel] = [] + var sourceType = 0 + var roomSendGiftType = 0 + var isBatch = false + +} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/Model/RectiveGiftUserModel.swift b/yinmeng-ios/Modules/Room/View/SendGift/Model/RectiveGiftUserModel.swift new file mode 100644 index 0000000..52c519d --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/Model/RectiveGiftUserModel.swift @@ -0,0 +1,18 @@ +// +// RectiveGiftUserModel.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/23. +// + +import UIKit +import HandyJSON +class RectiveGiftUserModel: HandyJSON { + required init(){ + + } + + var nick = "" + var avatar = "" + var uid = 0 +} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftModel.swift b/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftModel.swift new file mode 100644 index 0000000..4af1853 --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftModel.swift @@ -0,0 +1,50 @@ +// +// SendGiftModel.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/22. +// + +import UIKit +import HandyJSON + +class SendGiftModel: HandyJSON{ + required init() { + + } + var giftType = "" + var giftId = 0 + + var giftName = "" + + var goldPrice = 0 + + var giftUrl = "" + + var hasVggPic = false + + var vggUrl = "" + + var hasLatest = false + + var hasTimeLimit = false + + var hasEffect = false + + var roomExclude = false + + var isSendMsg = false + + + var viewUrl = "" + + + var count = 0 + var reciveCount = 0 + + + var isSelected = false + + + +} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftSendNumModel.swift b/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftSendNumModel.swift new file mode 100644 index 0000000..f7305db --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftSendNumModel.swift @@ -0,0 +1,22 @@ +// +// SendGiftSendNumModel.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/22. +// + +import UIKit +import HandyJSON +class SendGiftSendNumModel: HandyJSON{ + required init() { + + } + + required init(text:String,num:String){ + self.text = text + self.num = num + } + var text = "" + var num = "" + var isCustom = false +} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftUserModel.swift b/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftUserModel.swift index 43c78cd..606fdcf 100644 --- a/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftUserModel.swift +++ b/yinmeng-ios/Modules/Room/View/SendGift/Model/SendGiftUserModel.swift @@ -8,7 +8,10 @@ import UIKit import HandyJSON -struct SendGiftUserModel: HandyJSON{ +class SendGiftUserModel: HandyJSON{ + required init(){ + + } var avatar = "" var nick = "" var position = "" diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftCell.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftCell.swift new file mode 100644 index 0000000..97ed01b --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftCell.swift @@ -0,0 +1,153 @@ +// +// SendGiftCell.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/22. +// + +import UIKit +import Nuke + +class SendGiftCell: UICollectionViewCell { + override init(frame: CGRect) { + super.init(frame: frame) + setUILayout() + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + private func setUILayout(){ + contentView.addSubview(selectView) + contentView.addSubview(tagContainerView) + contentView.addSubview(giftView) + contentView.addSubview(nameView) + contentView.addSubview(diamondContainerView) + contentView.addSubview(giftNumView) + + tagContainerView.addArrangedSubview(tagDedicatedView) + tagContainerView.addArrangedSubview(tagLatestView) + tagContainerView.addArrangedSubview(tagLimitView) + tagContainerView.addArrangedSubview(tagEffectView) + + diamondContainerView.addArrangedSubview(diamondView) + diamondContainerView.addArrangedSubview(diamondNumView) + + selectView.snp.makeConstraints { make in + make.edges.equalTo(contentView) + } + tagContainerView.snp.makeConstraints { make in + make.trailing.top.equalTo(contentView).inset(UIDevice.scaleWidth(width: 3)) + make.height.equalTo(UIDevice.scaleWidth(width: 14)) + } + giftView.snp.makeConstraints { make in + make.width.height.equalTo(UIDevice.scaleWidth(width: 48)) + make.top.equalTo(UIDevice.scaleWidth(width: 18)) + make.centerX.equalTo(contentView) + } + nameView.snp.makeConstraints { make in + make.top.equalTo(giftView.snp.bottom).offset(UIDevice.scaleWidth(width: 3)) + make.centerX.equalTo(contentView) + } + diamondContainerView.snp.makeConstraints { make in + make.top.equalTo(nameView.snp.bottom).offset(UIDevice.scaleWidth(width: 5)) + make.centerX.equalTo(contentView) + make.height.equalTo(UIDevice.scaleWidth(width: 10)) + } + diamondView.snp.makeConstraints { make in + make.width.equalTo(UIDevice.scaleWidth(width: 10)) + } + giftNumView.snp.makeConstraints { make in + make.top.equalTo(UIDevice.scaleWidth(width: 4.5)) + make.leading.equalTo(UIDevice.scaleWidth(width: 6)) + } + + } + var giftModel:SendGiftModel? = nil{ + didSet{ + guard let _giftModel = giftModel else { return } + Nuke.loadImage(with: _giftModel.giftUrl, into: giftView, completion: nil) + nameView.text = _giftModel.giftName + diamondNumView.text = "\(_giftModel.goldPrice)" + giftNumView.isHidden = _giftModel.count <= 0 + giftNumView.text = "x\(_giftModel.count)" + tagDedicatedView.isHidden = !_giftModel.roomExclude + tagLatestView.isHidden = !_giftModel.hasLatest + tagLimitView.isHidden = !_giftModel.hasTimeLimit + tagEffectView.isHidden = !_giftModel.hasEffect + selectView.isHidden = !_giftModel.isSelected + + } + } + //MARK: - 懒加载 + private lazy var tagContainerView:UIStackView = { + let _tagContainerView = UIStackView() + _tagContainerView.axis = .horizontal + _tagContainerView.distribution = .fill + _tagContainerView.alignment = .center + _tagContainerView.spacing = UIDevice.scaleWidth(width: 2) + + return _tagContainerView + }() + private lazy var tagDedicatedView:UIImageView = { + let _tagDedicatedView = UIImageView() + _tagDedicatedView.image = UIImage(named: "yin_room_gift_tag_dedicated") + + return _tagDedicatedView + }() + private lazy var tagLimitView:UIImageView = { + let _tagLimitView = UIImageView() + _tagLimitView.image = UIImage(named: "yin_room_gift_tag_limit") + return _tagLimitView + }() + private lazy var tagEffectView:UIImageView = { + let _tagEffectView = UIImageView() + _tagEffectView.image = UIImage(named: "yin_room_gift_tag_effect") + return _tagEffectView + }() + private lazy var tagLatestView:UIImageView = { + let _tagLatestView = UIImageView() + _tagLatestView.image = UIImage(named: "yin_room_gift_tag_latest") + return _tagLatestView + }() + private lazy var diamondContainerView:UIStackView = { + let _diamondContainerView = UIStackView() + _diamondContainerView.axis = .horizontal + _diamondContainerView.distribution = .fill + _diamondContainerView.alignment = .center + _diamondContainerView.spacing = UIDevice.scaleWidth(width: 2) + + return _diamondContainerView + }() + private lazy var diamondView:UIImageView = { + let _diamondView = UIImageView() + _diamondView.image = UIImage(named: "yin_room_gift_diamond") + return _diamondView + }() + private lazy var diamondNumView:UILabel = { + let _diamondNumView = UILabel.getCustomLabel(text: "0",font: UIFont.getScaleFont(ofSize: 9, weight: .regular),color: .white) + return _diamondNumView + }() + private lazy var nameView:UILabel = { + let _nameView = UILabel.getCustomLabel(text: "",font: UIFont.getScaleFont(ofSize: 10, weight: .semibold),color: .white,textAlignment: .center) + + return _nameView + }() + private lazy var giftNumView:UILabel = { + let _giftNumView = UILabel.getCustomLabel(font: UIFont.getScaleFont(ofSize: 10, weight: .regular),color: UIColor(white: 1, alpha: 0.6)) + + return _giftNumView + }() + private lazy var giftView:UIImageView = { + let _giftView = UIImageView() + + return _giftView + }() + private lazy var selectView:UIImageView = { + let _selectView = UIImageView() + _selectView.image = UIImage(named: "yin_room_gift_select") + + return _selectView + }() +} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftFaceplateView.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftFaceplateView.swift deleted file mode 100644 index 520584b..0000000 --- a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftFaceplateView.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// SendGiftFaceplateView.swift -// yinmeng-ios -// -// Created by duoban on 2024/3/14. -// - -import UIKit - -class SendGiftFaceplateView: UIView { - - override init(frame: CGRect) { - super.init(frame: frame) - setUILayout() - - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - private func setUILayout(){ - addSubview(dissBtn) - addSubview(bgMaskView) - addSubview(contentStackView) - } - //MARK: - 懒加载 - private lazy var dissBtn:UIButton = { - let _dissBtn = UIButton() - return _dissBtn - }() - private lazy var bgMaskView:UIVisualEffectView = { - let blur = UIBlurEffect(style: .dark) - let _bgMaskView = UIVisualEffectView(effect: blur) - - return _bgMaskView - }() - private lazy var contentStackView:UIStackView = { - let _contentStackView = UIStackView() - _contentStackView.axis = .vertical - _contentStackView.distribution = .fill - _contentStackView.alignment = .fill - _contentStackView.spacing = 0 - _contentStackView.backgroundColor = .clear - return _contentStackView - }() -} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendNumCell.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendNumCell.swift new file mode 100644 index 0000000..f92b7a1 --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendNumCell.swift @@ -0,0 +1,80 @@ +// +// SendGiftSendNumCell.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/22. +// + +import UIKit + +class SendGiftSendNumCell: UITableViewCell { + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setUILayout() + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + private func setUILayout(){ + selectionStyle = .none + backgroundColor = .clear + contentView.backgroundColor = .clear + contentView.addSubview(textVeiw) + contentView.addSubview(numView) + contentView.addSubview(arrowView) + textVeiw.snp.makeConstraints { make in + make.leading.equalTo(UIDevice.scaleWidth(width: 20)) + make.centerY.equalTo(self.contentView) + + } + numView.snp.makeConstraints { make in + make.trailing.equalTo(-UIDevice.scaleWidth(width: 20)) + make.centerY.equalTo(self.contentView) + make.leading.greaterThanOrEqualTo(textVeiw.snp.trailing).offset(UIDevice.scaleWidth(width: 5)) + } + arrowView.snp.makeConstraints { make in + make.trailing.equalTo(-UIDevice.scaleWidth(width: 20)) + make.centerY.equalTo(self.contentView) + make.width.height.equalTo(UIDevice.scaleWidth(width: 10)) + } + } + + //MARK: - 懒加载 + var model:SendGiftSendNumModel? = nil{ + didSet{ + guard let _model = model else { return} + textVeiw.text = _model.text + numView.text = _model.num + arrowView.isHidden = !_model.isCustom + } + } + private lazy var numView:UILabel = { + let _numView = UILabel.getCustomLabel(font: UIFont.getScaleFont(ofSize: 14, weight: .regular),color: ThemeColor(hexStr: "#FFE710"),textAlignment: .right) + + return _numView + }() + private lazy var textVeiw:UILabel = { + let _textVeiw = UILabel.getCustomLabel(font: UIFont.getScaleFont(ofSize: 13, weight: .regular),color: .white) + + return _textVeiw + }() + private lazy var arrowView:UIImageView = { + let _arrowView = UIImageView() + _arrowView.image = UIImage(named: "yin_room_gift_arrow") + + return _arrowView + }() + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + +} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendNumView.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendNumView.swift new file mode 100644 index 0000000..478941f --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendNumView.swift @@ -0,0 +1,98 @@ +// +// SendGiftSendNumView.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/22. +// + +import UIKit + +typealias ClickSendNumBlcok = (_ model:SendGiftSendNumModel) -> Void + + +class SendGiftSendNumView: UIView { + var clickSendNumBlcok:ClickSendNumBlcok? + override init(frame: CGRect) { + super.init(frame: frame) + setUILayout() + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + private func setUILayout(){ + layer.cornerRadius = UIDevice.scaleWidth(width: 12) + layer.masksToBounds = true + let model1 = SendGiftSendNumModel(text: "一心一意", num: "1") + let model10 = SendGiftSendNumModel(text: "十全十美", num: "10") + let model66 = SendGiftSendNumModel(text: "一切顺利", num: "66") + let model99 = SendGiftSendNumModel(text: "长长久久", num: "99") + let model188 = SendGiftSendNumModel(text: "要抱抱", num: "188") + let model520 = SendGiftSendNumModel(text: "我爱你", num: "520") + let model1314 = SendGiftSendNumModel(text: "一生一世", num: "1314") + let otherModel = SendGiftSendNumModel(text: "其他数额", num: "") + otherModel.isCustom = true + listData.append(model1) + listData.append(model10) + listData.append(model66) + listData.append(model99) + listData.append(model188) + listData.append(model520) + listData.append(model1314) + listData.append(otherModel) + + + addSubview(visualEffectView) + addSubview(tableView) + + visualEffectView.snp.makeConstraints { make in + make.edges.equalTo(self) + } + tableView.snp.makeConstraints { make in + make.edges.equalTo(self) + } + tableView.delegate = self + tableView.dataSource = self + tableView.register(SendGiftSendNumCell.self, forCellReuseIdentifier: "SendGiftSendNumCell") + + + } + //MARK: - 懒加载 + var listData:[SendGiftSendNumModel] = [] + private lazy var visualEffectView:UIVisualEffectView = { + let blue = UIBlurEffect(style: .dark) + let _visualEffectView = UIVisualEffectView.init(effect: blue) + + return _visualEffectView + }() + private lazy var tableView:UITableView = { + let _tableView = UITableView(frame: .zero, style: .plain) + _tableView.separatorStyle = .none + _tableView.backgroundColor = ThemeColor(hexStr: "#000000", alpha: 0.1) + + return _tableView + }() +} +extension SendGiftSendNumView:UITableViewDelegate,UITableViewDataSource{ + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return listData.count + } + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return UIDevice.scaleWidth(width: 28) + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "SendGiftSendNumCell", for: indexPath) as! SendGiftSendNumCell + cell.model = listData[safe: indexPath.row] + return cell + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + if let _clickSendNumBlcok = clickSendNumBlcok{ + let model = listData[safe: indexPath.row]! + _clickSendNumBlcok(model) + self.removeFromSuperview() + } + } + +} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendView.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendView.swift new file mode 100644 index 0000000..8d6e667 --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftSendView.swift @@ -0,0 +1,204 @@ +// +// SendGiftSendView.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/22. +// + +import UIKit + +enum SendGiftSendViewType { +case pay,send +} +typealias ClickSendGiftBlock = (_ type:SendGiftSendViewType,_ count:String)->Void + +class SendGiftSendView: UIView { + var clickSendGiftBlock:ClickSendGiftBlock? + override init(frame: CGRect) { + super.init(frame: frame) + setUILayout() + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + private func setUILayout(){ + backgroundColor = .clear + addSubview(bgRechargeView) + addSubview(sendStackView) + + bgRechargeView.addArrangedSubview(diamondView) + bgRechargeView.addArrangedSubview(diamondNumView) + bgRechargeView.addArrangedSubview(arrowView) + + sendStackView.addArrangedSubview(numView) + sendStackView.addArrangedSubview(sendArrowView) + sendStackView.addArrangedSubview(sendBtn) + self.snp.makeConstraints { make in + make.height.equalTo(UIDevice.scaleWidth(width: 45) + SafeAraeBottomHeight) + } + bgRechargeView.snp.makeConstraints { make in + make.leading.equalTo(UIDevice.scaleWidth(width: 15)) + make.height.equalTo(UIDevice.scaleWidth(width: 32)) + make.centerY.equalTo(sendBtn) + } + sendStackView.snp.makeConstraints { make in + make.trailing.equalTo(-UIDevice.scaleWidth(width: 15)) + make.top.equalTo(UIDevice.scaleWidth(width: 11)) + make.height.equalTo(UIDevice.scaleWidth(width: 32)) + } + diamondView.snp.makeConstraints { make in + make.leading.equalTo(UIDevice.scaleWidth(width: 10)) + make.width.height.equalTo(UIDevice.scaleWidth(width: 14)) + } + arrowView.snp.makeConstraints { make in + make.trailing.equalTo(-UIDevice.scaleWidth(width: 10)) + make.width.height.equalTo(UIDevice.scaleWidth(width: 15)) + } + numView.snp.makeConstraints { make in + make.width.equalTo(UIDevice.scaleWidth(width: 40)) + make.height.equalTo(UIDevice.scaleWidth(width: 30)) + } + sendArrowView.snp.makeConstraints { make in + make.width.height.equalTo(UIDevice.scaleWidth(width: 30)) + } + sendBtn.snp.makeConstraints { make in + make.width.equalTo(UIDevice.scaleWidth(width: 60)) + make.height.equalTo(UIDevice.scaleWidth(width: 30)) + } + sendNumView.clickSendNumBlcok = {[weak self] model in + guard let self = self else { return } + if model.isCustom{ + + self.superview?.superview?.superview?.addSubview(self.sendTextView) + self.sendTextView.textFiled.becomeFirstResponder() + return + } + self.numView.text = model.num + + } + sendTextView.sendGiftNumBlock = {[weak self] text in + guard let self = self else { return } + self.numView.text = text + + } + let tap = UITapGestureRecognizer.init(target: self, action: #selector(clickPyaAction)) + bgRechargeView.isUserInteractionEnabled = true + bgRechargeView.addGestureRecognizer(tap) + + } + @objc func clickPyaAction(){ + if let clickSendGiftBlock = self.clickSendGiftBlock{ + clickSendGiftBlock(.pay,"0") + } + } + + @objc func clickSendGiftAction(){ + if let clickSendGiftBlock = self.clickSendGiftBlock,let text = numView.text{ + clickSendGiftBlock(.send,text) + + } + } + + @objc func clickSendArrowAction(){ + if (sendNumView.superview == nil){ + superview?.superview?.addSubview(sendNumView) + let bottom = -UIDevice.scaleWidth(width: 45)-SafeAraeBottomHeight + sendNumView.snp.makeConstraints { make in + make.trailing.equalTo(-UIDevice.scaleWidth(width: 15)) + make.bottom.equalTo( bottom) + make.width.equalTo(UIDevice.scaleWidth(width: 135)) + make.height.equalTo(UIDevice.scaleWidth(width: 224)) + } + } + sendArrowView.isSelected = !sendArrowView.isSelected + sendNumView.isHidden = !sendArrowView.isSelected + } + //MARK: - 懒加载 + var diamond:String = "0"{ + didSet{ + diamondNumView.text = diamond + } + } + var isEnabled = true{ + didSet{ + sendBtn.isEnabled = isEnabled + } + } + private lazy var bgRechargeView:UIStackView = { + let _bgRechargeView = UIStackView() + _bgRechargeView.axis = .horizontal + _bgRechargeView.distribution = .fill + _bgRechargeView.alignment = .center + _bgRechargeView.spacing = UIDevice.scaleWidth(width: 3) + _bgRechargeView.backgroundColor = ThemeColor(hexStr: "#000000") + _bgRechargeView.layer.cornerRadius = UIDevice.scaleWidth(width: 32)/2 + _bgRechargeView.layer.masksToBounds = true + return _bgRechargeView + }() + private lazy var diamondView:UIImageView = { + let _diamondView = UIImageView() + _diamondView.image = UIImage(named: "yin_room_gift_diamond") + return _diamondView + }() + private lazy var diamondNumView:UILabel = { + let _diamondNumView = UILabel.getCustomLabel(text: "0",font: UIFont.getScaleFont(ofSize: 13, weight: .regular),color:.white) + + return _diamondNumView + }() + private lazy var arrowView:UIImageView = { + let _arrowView = UIImageView() + _arrowView.image = UIImage(named: "yin_room_gift_arrow") + + return _arrowView + }() + + private lazy var sendStackView:UIStackView = { + let _sendStackView = UIStackView() + _sendStackView.axis = .horizontal + _sendStackView.distribution = .fill + _sendStackView.alignment = .center + _sendStackView.spacing = 1 + _sendStackView.layer.masksToBounds = true + _sendStackView.layer.cornerRadius = UIDevice.scaleWidth(width: 15) + _sendStackView.layer.borderColor = ThemeColor(hexStr: "#FFE710").cgColor + _sendStackView.layer.borderWidth = 1 + + return _sendStackView + }() + private lazy var numView:UILabel = { + let _numView = UILabel.getCustomLabel(text: "1",font: UIFont.getScaleFont(ofSize: 13, weight: .regular),color: .white,textAlignment: .center) + + return _numView + }() + private lazy var sendArrowView:UIButton = { + let _sendArrowView = UIButton() + _sendArrowView.setImage( UIImage(named: "yin_room_gift_up_arrow"), for: .normal) + _sendArrowView.transform = CGAffineTransform(rotationAngle: Double.pi) + _sendArrowView.addTarget(self, action: #selector(clickSendArrowAction), for: .touchUpInside) + return _sendArrowView + }() + private lazy var sendBtn:UIButton = { + let image = UIImage.image(color: ThemeColor(hexStr: "#FFE710")) + let disabledImage = UIImage.image(color: ThemeColor(hexStr: "#F2F3F6")) + let selectedImage = UIImage.image(color: ThemeColor(hexStr: "#F2F3F6")) + + let _sendBtn = UIButton.getCustomBtn(text: "赠送",selectedText: "赠送中",disabledText: "赠送中...", font: UIFont.getScaleFont(ofSize: 14, weight: .medium),color: ThemeColor(hexStr: "#282828"),disabledColor: ThemeColor(hexStr: "#878B9C"),bgImage: image,selectedBgImage: selectedImage,disabledBgImage: disabledImage,masksToBounds: true) + + _sendBtn.addTarget(self, action: #selector(clickSendGiftAction), for: .touchUpInside) + return _sendBtn + }() + private lazy var sendNumView:SendGiftSendNumView = { + let _sendNumView = SendGiftSendNumView(frame: .zero) + + return _sendNumView + }() + + var sendTextView:RoomSendTextView = { + let bottom = ScreenHeight + 40 + let _sendTextView = RoomSendTextView(frame: CGRect(x: 0, y: bottom, width: ScreenWidth, height: UIDevice.scaleWidth(width: 40))) + _sendTextView.isSendGiftNum = true + return _sendTextView + }() +} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftTopView.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftTopView.swift index cacd652..7705e94 100644 --- a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftTopView.swift +++ b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftTopView.swift @@ -21,6 +21,9 @@ class SendGiftTopView: UIView { private func setUILayout(){ addSubview(giftBtn) addSubview(lineView) + self.snp.makeConstraints { make in + make.height.equalTo(UIDevice.scaleWidth(width: 44)) + } giftBtn.snp.makeConstraints { make in make.leading.equalTo(UIDevice.scaleWidth(width: 16)) make.centerY.equalTo(self) diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftUserCell.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftUserCell.swift index 402f9d4..7bb8a81 100644 --- a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftUserCell.swift +++ b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftUserCell.swift @@ -31,6 +31,7 @@ class SendGiftUserCell: UICollectionViewCell { } numView.snp.makeConstraints { make in make.height.equalTo(UIDevice.scaleWidth(width: 10)) + make.width.equalTo(UIDevice.scaleWidth(width: 10)) make.centerY.equalTo(avatarView.snp.bottom) make.centerX.equalTo(avatarView) } @@ -42,6 +43,10 @@ class SendGiftUserCell: UICollectionViewCell { guard let _model = model else { return} if let position = Int(_model.position){ numView.text = position == -1 ? "房主" : "\(position + 1)" + let width:CGFloat = position == -1 ? 28 : 10 + numView.snp.updateConstraints { make in + make.width.equalTo(UIDevice.scaleWidth(width: width)) + } } Nuke.loadImage(with: _model.avatar, into: avatarView, completion: nil) avatarView.layer.borderWidth = _model.isChoose ? 2 : 0 diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftUserView.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftUserView.swift index bcf8022..216cd1b 100644 --- a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftUserView.swift +++ b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftUserView.swift @@ -19,28 +19,119 @@ class SendGiftUserView: UIView { fatalError("init(coder:) has not been implemented") } private func setUILayout(){ + backgroundColor = .clear + addSubview(textVeiw) + addSubview(collectionView) + addSubview(allUserBtn) + addSubview(lineView) + self.snp.makeConstraints { make in + make.height.equalTo(UIDevice.scaleWidth(width: 73)) + } + textVeiw.snp.makeConstraints { make in + make.leading.equalTo(UIDevice.scaleWidth(width: 10)) + make.centerY.equalTo(self) + make.width.equalTo(UIDevice.scaleWidth(width: 53)) + make.height.equalTo(UIDevice.scaleWidth(width: 43)) + } + allUserBtn.snp.makeConstraints { make in + make.width.equalTo(UIDevice.scaleWidth(width: 36)) + make.height.equalTo(UIDevice.scaleWidth(width: 18)) + make.trailing.equalTo(-UIDevice.scaleWidth(width: 10)) + make.centerY.equalTo(self) + } + collectionView.snp.makeConstraints { make in + make.height.equalTo(UIDevice.scaleWidth(width: 43)) + make.leading.equalTo(textVeiw.snp.trailing).offset((UIDevice.scaleWidth(width: 10))) + make.trailing.equalTo(allUserBtn.snp.leading).offset(-UIDevice.scaleWidth(width:10)) + make.centerY.equalTo(self) + } + lineView.snp.makeConstraints { make in + make.height.equalTo(1) + make.leading.trailing.bottom.equalTo(self) + + } + collectionView.register(SendGiftUserCell.self, forCellWithReuseIdentifier: "SendGiftUserCell") + collectionView.delegate = self + collectionView.dataSource = self + } + @objc func clickAllChooseAction(){ + allUserBtn.isSelected = !allUserBtn.isSelected + for model in userList { + model.isChoose = allUserBtn.isSelected + } + collectionView.reloadData() + } + func getSendGiftUserList()->(Bool,[String]){ + var list:[String] = [] + for itme in userList{ + if itme.isChoose{ + list.append("\(itme.uid)") + } + } + return (allUserBtn.isSelected,list) } //MARK: - 懒加载 + var userList:[SendGiftUserModel] = []{ + didSet{ + collectionView.reloadData() + } + } + private lazy var textVeiw:UILabel = { let _textView = UILabel.getCustomLabel(text: "送给",font: UIFont.getScaleFont(ofSize: 13, weight: .medium),color: .white,textAlignment: .center) return _textView }() - private lazy var allUserBtn:UIButton = { + lazy var allUserBtn:UIButton = { let normalImage = UIImage.image(color: ThemeColor(hexStr: "#878B9C")) let selectedImage = UIImage.image(color: ThemeColor(hexStr: "#FFE710")) let _allUserBtn = UIButton.getCustomBtn(text: "全选",font: UIFont.getScaleFont(ofSize: 13, weight: .medium),color: .white,selectedColor: ThemeColor(hexStr: "#28282"),bgImage: normalImage,selectedBgImage: selectedImage) _allUserBtn.layer.cornerRadius = UIDevice.scaleWidth(width: 18)/2 _allUserBtn.layer.masksToBounds = true + _allUserBtn.addTarget(self, action: #selector(clickAllChooseAction), for: .touchUpInside) return _allUserBtn }() private lazy var collectionView:UICollectionView = { let flowLayout = UICollectionViewFlowLayout() flowLayout.scrollDirection = .horizontal flowLayout.itemSize = CGSize(width: UIDevice.scaleWidth(width: 38), height: UIDevice.scaleWidth(width: 43)) - let _collectionView = UICollectionView() + flowLayout.minimumInteritemSpacing = UIDevice.scaleWidth(width: 4) + flowLayout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) + let _collectionView = UICollectionView(frame: .zero,collectionViewLayout: flowLayout) + _collectionView.backgroundColor = .clear + _collectionView.showsHorizontalScrollIndicator = false return _collectionView }() + private lazy var lineView:UIView = { + let _lineView = UIView() + _lineView.backgroundColor = ThemeColor(hexStr: "#FFFFFF", alpha: 0.1) + return _lineView + }() +} +extension SendGiftUserView:UICollectionViewDelegate ,UICollectionViewDataSource{ + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return userList.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SendGiftUserCell", for: indexPath) as! SendGiftUserCell + cell.model = userList[safe: indexPath.row] + return cell + } + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + let model = userList[indexPath.row] + model.isChoose = !model.isChoose + var isAllChoose = true + for model in userList { + if !model.isChoose{ + isAllChoose = false + break + } + } + allUserBtn.isSelected = isAllChoose + collectionView.reloadData() + } + } diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftVC.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftVC.swift new file mode 100644 index 0000000..d792d96 --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftVC.swift @@ -0,0 +1,245 @@ +// +// SendGiftVC.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/22. +// + +import UIKit + +class SendGiftVC: BaseViewController, HiddenNavigationBarProtocol { + var roomUid = "" + var roomId = "" + var userData:UserObject? + override func viewDidLoad() { + super.viewDidLoad() + setUILayout() + requestData() + } + private func requestData(){ + getDiamondNum() + RequestGet(path: "gift/listV5", parma: ["roomUid":roomUid]) { data in + if let _data = data as? [String : Any],let giftData = _data["normalGift"]{ + if let list = Deserialized.toArray(with: giftData),!list.isEmpty { + let model = list.first + model?.isSelected = true + self.sendGiftView.giftList = list + + + } + } + + + } fail: { code, data in + + } + + } + func getDiamondNum(){ + RequestGet(path: "purse/query", parma: ["channelType":"8"]) { data in + if let model = Deserialized.toModel(with: data) { + self.sendView.diamond = model.diamonds + } + + } fail: { code, data in + + } + } + private func setUILayout(){ + view.backgroundColor = .clear + view.addSubview(dissBtn) + view.addSubview(contentView) + contentView.addSubview(bgMaskView) + contentView.addSubview(contentStackView) + + contentStackView.addArrangedSubview(topView) + contentStackView.addArrangedSubview(sendUserView) + contentStackView.addArrangedSubview(sendGiftView) + contentStackView.addArrangedSubview(sendView) + + dissBtn.snp.makeConstraints { make in + make.edges.equalTo(view) + } + contentView.snp.makeConstraints { make in + make.top.equalTo(contentStackView.snp.top) + make.width.equalTo(ScreenWidth) + make.leading.bottom.equalTo(UIDevice.scaleWidth(width: 0)) + } + bgMaskView.snp.makeConstraints { make in + make.leading.trailing.top.bottom.equalTo(contentView) + } + contentStackView.snp.makeConstraints { make in + make.leading.trailing.bottom.equalTo(contentView) + } + sendView.clickSendGiftBlock = {[weak self] (type,text) in + guard let self = self else { return } + if type == .pay{ + let vc = UserPayViewController() + self.navigationController?.pushViewController(vc, animated: true) + }else if type == .send{ + self.sendGiftAction(text: text) + } + + } + } + func sendGiftAction(text:String){ + let userList = sendUserView.getSendGiftUserList() + guard !userList.1.isEmpty else{ + HUDTool.show(with: "请选择至少一个用户") + return + } + guard let selectModel = sendGiftView.selectModel else { + HUDTool.show(with: "请选择赠送的礼物") + return + } + + let giftNum = Int(text) ?? 0 + let type = "3" + let sourceType = "1" + let giftId = "\(selectModel.giftId)" + let userUidText = getUserText(list: userList.1) + let giftType = selectModel.giftType + var roomType = userList.0 ? 0 : 1 + if userList.0 == false,userList.1.count == 1{ + roomType = 2 + } + if isSendPerson { + roomType = 2 + } + sendView.isEnabled = false + let parmas = ["giftNum":giftNum,"targetUids":userUidText,"sendType":type,"giftId":giftId,"giftSource":sourceType,"giftType":selectModel.giftType,"msg":"","roomUid":roomUid,"uid":"\(AuthManager.userUid)"] as [String : Any] + RequestPost(path: "gift/sendV4", parma:parmas) { data in + if let model = Deserialized.toModel(with: data),let _data = data as? [String:Any] { + model.sourceType = Int(sourceType) ?? 1 + model.roomSendGiftType = roomType + self.sendGiftSuccess(model: model, data: _data, uidList: userList.1) + } + + } fail: { code, data in + self.sendView.isEnabled = true + HUDTool.show(with: data) + } + + } + func sendGiftSuccess(model:RectiveGiftModel,data:[String:Any],uidList:[String]){ + getDiamondNum() + self.sendView.isEnabled = true + if model.roomSendGiftType == 0{ + let customMsgModel = ChatCustomMsgModel() + customMsgModel.first = 12 + customMsgModel.second = 121 + var getData = data + var list:[String] = [] + for item in model.targetUsers { + list.append("\(item.uid)") + } + getData["targetUids"] = list + customMsgModel.data = getData + sendMsg(model: customMsgModel) + + }else if model.roomSendGiftType == 1{ + let customMsgModel = ChatCustomMsgModel() + customMsgModel.first = 12 + customMsgModel.second = 123 + customMsgModel.data = data + sendMsg(model: customMsgModel) + }else{ + let customMsgModel = ChatCustomMsgModel() + customMsgModel.first = 3 + customMsgModel.second = 31 + var getData = data + if let curModel = model.targetUsers[safe: 0]{ + getData["targetUid"] = curModel.uid + getData["targetNick"] = curModel.nick + getData["targetAvatar"] = curModel.avatar + } + customMsgModel.data = getData + sendMsg(model: customMsgModel) + } + + } + func sendMsg(model:ChatCustomMsgModel){ + let msgId = self.roomId + let msg = NIMMessage() + let obj = NIMCustomObject() + obj.attachment = model + msg.messageObject = obj + + let session = NIMSession.init(msgId, type: .chatroom) + try? NIMSDK.shared().chatManager.send(msg, to: session) + } + func getUserText(list:[String])->String{ + var text = "" + for uid in list { + text = text.isEmpty ? uid : text + "," + uid + } + return text + } + @objc func clickDissBtnAction(){ + self.dismiss(animated: true) + } + //MARK: - 懒加载 + var isSendPerson = false { + didSet{ + sendUserView.allUserBtn.isHidden = true + } + } + var userList:[SendGiftUserModel] = []{ + didSet{ + if userList.isEmpty{ + sendUserView.isHidden = true + return + } + sendUserView.userList = userList + } + } + private lazy var dissBtn:UIButton = { + let _dissBtn = UIButton() + _dissBtn.addTarget(self, action: #selector(clickDissBtnAction), for: .touchUpInside) + return _dissBtn + }() + private lazy var bgMaskView:UIVisualEffectView = { + let blur = UIBlurEffect(style: .dark) + let _bgMaskView = UIVisualEffectView(effect: blur) + + return _bgMaskView + }() + private lazy var contentView:UIView = { + let _contentView = UIView() + let path = UIBezierPath.init(roundedRect: CGRect(x: 0, y: 0, width: ScreenWidth, height: ScreenHeight), byRoundingCorners: [.topLeft,.topRight], cornerRadii: CGSize(width: 8, height: 8)) + let layer = CAShapeLayer() + layer.frame = CGRect(x: 0, y: 0, width: ScreenWidth, height: ScreenHeight) + layer.path = path.cgPath + _contentView.layer.mask = layer + return _contentView + }() + private lazy var contentStackView:UIStackView = { + let _contentStackView = UIStackView() + _contentStackView.axis = .vertical + _contentStackView.distribution = .fill + _contentStackView.alignment = .fill + _contentStackView.spacing = 0 + _contentStackView.backgroundColor = .clear + return _contentStackView + }() + private lazy var topView:SendGiftTopView = { + let _topView = SendGiftTopView(frame: .zero) + + return _topView + }() + private lazy var sendUserView:SendGiftUserView = { + let _sendUserView = SendGiftUserView(frame: .zero) + + return _sendUserView + }() + private lazy var sendGiftView:SendGiftView = { + let _sendGiftView = SendGiftView(frame: .zero) + + return _sendGiftView + }() + private lazy var sendView:SendGiftSendView = { + let _sendView = SendGiftSendView(frame: .zero) + + return _sendView + }() +} diff --git a/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftView.swift b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftView.swift new file mode 100644 index 0000000..4e9c70e --- /dev/null +++ b/yinmeng-ios/Modules/Room/View/SendGift/View/SendGiftView.swift @@ -0,0 +1,91 @@ +// +// SendGiftView.swift +// yinmeng-ios +// +// Created by duoban on 2024/3/22. +// + +import UIKit + +class SendGiftView: UIView { + + override init(frame: CGRect) { + super.init(frame: frame) + setUILayout() + + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + private func setUILayout(){ + addSubview(giftBtn) + addSubview(collectionView) + self.snp.makeConstraints { make in + make.height.equalTo(UIDevice.scaleWidth(width: 271)) + } + giftBtn.snp.makeConstraints { make in + make.width.height.equalTo(UIDevice.scaleWidth(width: 30)) + make.leading.equalTo(UIDevice.scaleWidth(width: 15)) + make.top.equalTo(self) + } + collectionView.snp.makeConstraints { make in + make.height.equalTo(UIDevice.scaleWidth(width: 236)) + make.top.equalTo(giftBtn.snp.bottom).offset(UIDevice.scaleWidth(width: 10)) + make.leading.trailing.equalTo(self).inset(UIDevice.scaleWidth(width: 0)) + } + collectionView.delegate = self + collectionView.dataSource = self + collectionView.register(SendGiftCell.self, forCellWithReuseIdentifier: "SendGiftCell") + } + @objc func clickGiftBntAction(){ + + } + var giftList:[SendGiftModel] = []{ + didSet{ + guard !giftList.isEmpty else { return} + selectModel = giftList.first + collectionView.reloadData() + } + } + var selectModel:SendGiftModel? + //MARK: - 懒加载 + private lazy var giftBtn:UIButton = { + let _giftBtn = UIButton.getCustomBtn(type: .custom,text: "普通",font: UIFont.getScaleFont(ofSize: 13, weight: .semibold),color: ThemeColor(hexStr: "#BDBFD0"),selectedColor: ThemeColor(hexStr: "#FFE710")) + _giftBtn.isSelected = true + _giftBtn.addTarget(self, action: #selector(clickGiftBntAction), for: .touchUpInside) + return _giftBtn + }() + private lazy var collectionView:UICollectionView = { + let flowLayout = UICollectionViewFlowLayout() + let itemWidth = (ScreenWidth - UIDevice.scaleWidth(width: 45)) / 4; + flowLayout.itemSize = CGSizeMake(itemWidth, UIDevice.scaleWidth(width: 108)) + flowLayout.sectionInset = UIEdgeInsets(top: 0, left: UIDevice.scaleWidth(width: 14), bottom: 0, right: UIDevice.scaleWidth(width: 14)) + flowLayout.minimumLineSpacing = UIDevice.scaleWidth(width: 5) + flowLayout.minimumInteritemSpacing = UIDevice.scaleWidth(width: 5) + let _collectionView = UICollectionView(frame: .zero,collectionViewLayout: flowLayout) + _collectionView.backgroundColor = .clear + return _collectionView + }() +} +extension SendGiftView:UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{ + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return giftList.count + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SendGiftCell", for: indexPath) as! SendGiftCell + cell.giftModel = giftList[safe: indexPath.row] + return cell + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + for item in giftList { + item.isSelected = false + } + var model = giftList[safe: indexPath.row] + selectModel = model + model?.isSelected = true + collectionView.reloadData() + } +}