From e82939f7671f47f9a3b30782dc4908959ce243c1 Mon Sep 17 00:00:00 2001 From: edwinQQQ Date: Mon, 16 Dec 2024 19:41:23 +0800 Subject: [PATCH] =?UTF-8?q?70%=20=E5=AE=8C=E6=88=90=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- YuMi.xcodeproj/project.pbxproj | 36 + YuMi/Assets.xcassets/1.0.31/Contents.json | 6 + .../room_user_card_at.imageset/3@3x.png | Bin 0 -> 14011 bytes .../room_user_card_at.imageset}/Contents.json | 2 +- .../2@3x (1).png | Bin 0 -> 5629 bytes .../Contents.json | 2 +- .../3@3x (1).png | Bin 0 -> 6110 bytes .../Contents.json | 2 +- .../room_user_card_chat.imageset/2@3x.png | Bin 0 -> 12647 bytes .../Contents.json | 2 +- .../2@3x (3).png | Bin 0 -> 6154 bytes .../Contents.json | 21 + .../5@3x (3).png | Bin 0 -> 6763 bytes .../Contents.json | 21 + .../4@3x (1).png | Bin 0 -> 13079 bytes .../Contents.json | 21 + .../room_user_card_gift.imageset/2@3x (2).png | Bin 0 -> 5033 bytes .../Contents.json | 21 + .../room_user_card_kick.imageset/1@3x.png | Bin 0 -> 5047 bytes .../Contents.json | 21 + .../room_user_card_lock.imageset/1@3x (1).png | Bin 0 -> 4978 bytes .../Contents.json | 21 + .../5@3x (2).png | Bin 0 -> 5924 bytes .../Contents.json | 21 + .../4@3x (2).png | Bin 0 -> 6021 bytes .../Contents.json | 21 + .../5@3x (1).png | Bin 0 -> 6399 bytes .../Contents.json | 21 + .../Contents.json | 21 + .../举报@3x.png | Bin 0 -> 2426 bytes .../1@3x.png | Bin 0 -> 29541 bytes .../Contents.json | 21 + .../room_user_card_unfollow.imageset/4@3x.png | Bin 0 -> 6012 bytes .../Contents.json | 21 + .../1@3x (2).png | Bin 0 -> 5077 bytes .../Contents.json | 21 + .../room_user_card_up_mic.imageset/5@3x.png | Bin 0 -> 6404 bytes .../Contents.json | 21 + .../Contents.json | 21 - .../user_card_clean_gift_value.png | Bin 825 -> 0 bytes .../user_card_close_mic.png | Bin 1025 -> 0 bytes .../Contents.json | 21 - .../user_card_down_mic_listen.png | Bin 933 -> 0 bytes .../user_card_lock_mic.png | Bin 922 -> 0 bytes .../user_card_no_lock_mic.png | Bin 854 -> 0 bytes .../user_card_open_mic.png | Bin 988 -> 0 bytes YuMi/CustomUI/MoliAvatar.h | 22 + YuMi/CustomUI/MoliAvatar.m | 153 ++ YuMi/CustomUI/SexAgeLabel.h | 18 + YuMi/CustomUI/SexAgeLabel.m | 65 + .../View/LoginFullInfoViewController.m | 104 +- .../YMLogin/View/RegionListViewController.h | 22 + .../YMLogin/View/RegionListViewController.m | 324 ++++ .../View/XPHomePagingViewController.m | 6 + .../YMNewHome/View/XPNewHomeViewController.m | 247 ++- .../View/AnimationView/XPRoomAnimationView.m | 17 +- .../XPRoomMenuContainerView.m | 3 + .../XPRoomMessageContainerView.m | 2 +- .../View/Cell/XPGiftItemCollectionViewCell.m | 1 - .../View/PIGiftSuperGiftBroadcastView.m | 4 + .../View/SendGiftView/View/XPSendGiftView.m | 3 + .../View/StageView/MicroView/MicroWaveView.m | 11 +- .../View/StageView/NineteenMicStageView.h | 16 + .../View/StageView/NineteenMicStageView.m | 131 ++ .../Modules/YMRoom/View/StageView/StageView.m | 133 +- .../View/StageView/TwentyMicStageView.h | 18 + .../View/StageView/TwentyMicStageView.m | 87 + .../UserCard/Presenter/XPUserCardPresenter.m | 35 +- .../View/UserRoomCardViewController.h | 20 + .../View/UserRoomCardViewController.m | 1500 +++++++++++++++++ .../YMRoom/View/XPRoomViewController.m | 37 +- YuMi/Structure/MVP/Model/UserInfoModel.h | 2 + YuMi/Tools/IAPHelper/RechargeStorage.m | 2 +- YuMi/ar.lproj/Localizable.strings | 5 + YuMi/en.lproj/Localizable.strings | 5 + YuMi/tr.lproj/Localizable.strings | 7 +- YuMi/zh-Hant.lproj/Localizable.strings | 5 + 77 files changed, 3232 insertions(+), 159 deletions(-) create mode 100644 YuMi/Assets.xcassets/1.0.31/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_at.imageset/3@3x.png rename YuMi/Assets.xcassets/{yna/UserCard/user_card_open_mic.imageset => 1.0.31/room_user_card_at.imageset}/Contents.json (85%) create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_be_manager.imageset/2@3x (1).png rename YuMi/Assets.xcassets/{yna/UserCard/user_card_lock_mic.imageset => 1.0.31/room_user_card_be_manager.imageset}/Contents.json (85%) create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_blacklist.imageset/3@3x (1).png rename YuMi/Assets.xcassets/{yna/UserCard/user_card_close_mic.imageset => 1.0.31/room_user_card_blacklist.imageset}/Contents.json (85%) create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_chat.imageset/2@3x.png rename YuMi/Assets.xcassets/{yna/UserCard/user_card_no_lock_mic.imageset => 1.0.31/room_user_card_chat.imageset}/Contents.json (84%) create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_clean_gift_value.imageset/2@3x (3).png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_clean_gift_value.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_close_mic.imageset/5@3x (3).png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_close_mic.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_follow.imageset/4@3x (1).png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_follow.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_gift.imageset/2@3x (2).png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_gift.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_kick.imageset/1@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_kick.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_lock.imageset/1@3x (1).png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_lock.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_not_manager.imageset/5@3x (2).png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_not_manager.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_open_mic.imageset/4@3x (2).png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_open_mic.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_out_mic.imageset/5@3x (1).png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_out_mic.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_report.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_report.imageset/举报@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_send_gift.imageset/1@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_send_gift.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_unfollow.imageset/4@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_unfollow.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_unlock.imageset/1@3x (2).png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_unlock.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_up_mic.imageset/5@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.31/room_user_card_up_mic.imageset/Contents.json delete mode 100644 YuMi/Assets.xcassets/yna/UserCard/user_card_clean_gift_value.imageset/Contents.json delete mode 100644 YuMi/Assets.xcassets/yna/UserCard/user_card_clean_gift_value.imageset/user_card_clean_gift_value.png delete mode 100644 YuMi/Assets.xcassets/yna/UserCard/user_card_close_mic.imageset/user_card_close_mic.png delete mode 100644 YuMi/Assets.xcassets/yna/UserCard/user_card_down_mic_listen.imageset/Contents.json delete mode 100644 YuMi/Assets.xcassets/yna/UserCard/user_card_down_mic_listen.imageset/user_card_down_mic_listen.png delete mode 100644 YuMi/Assets.xcassets/yna/UserCard/user_card_lock_mic.imageset/user_card_lock_mic.png delete mode 100644 YuMi/Assets.xcassets/yna/UserCard/user_card_no_lock_mic.imageset/user_card_no_lock_mic.png delete mode 100644 YuMi/Assets.xcassets/yna/UserCard/user_card_open_mic.imageset/user_card_open_mic.png create mode 100644 YuMi/CustomUI/MoliAvatar.h create mode 100644 YuMi/CustomUI/MoliAvatar.m create mode 100644 YuMi/CustomUI/SexAgeLabel.h create mode 100644 YuMi/CustomUI/SexAgeLabel.m create mode 100644 YuMi/Modules/YMLogin/View/RegionListViewController.h create mode 100644 YuMi/Modules/YMLogin/View/RegionListViewController.m create mode 100644 YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.h create mode 100644 YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.m create mode 100644 YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.h create mode 100644 YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.m create mode 100644 YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.h create mode 100644 YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.m diff --git a/YuMi.xcodeproj/project.pbxproj b/YuMi.xcodeproj/project.pbxproj index bed8a1ba..d97deb03 100644 --- a/YuMi.xcodeproj/project.pbxproj +++ b/YuMi.xcodeproj/project.pbxproj @@ -497,6 +497,7 @@ 23FF42792AA6E19C0055733C /* HomeMenuSourceModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 23FF42782AA6E19C0055733C /* HomeMenuSourceModel.m */; }; 23FF428E2AAB2D3A0055733C /* XPCandyTreeBuyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23FF428D2AAB2D3A0055733C /* XPCandyTreeBuyView.m */; }; 4C1892992CF84349004D4426 /* RoomCahtCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1892982CF84349004D4426 /* RoomCahtCell.m */; }; + 4C5C37232D0C1C7900BA9AB8 /* RegionListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5C37222D0C1C7900BA9AB8 /* RegionListViewController.m */; }; 4C6E1F752CEAEC3C0073D0A3 /* ShoppingMallTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6E1F742CEAEC3C0073D0A3 /* ShoppingMallTagView.m */; }; 4C6E1F792CEB12780073D0A3 /* UIView+GradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6E1F782CEB12780073D0A3 /* UIView+GradientLayer.m */; }; 4C6E1F7C2CEB25B10073D0A3 /* ShoppingMallItemPreview.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6E1F7B2CEB25B10073D0A3 /* ShoppingMallItemPreview.m */; }; @@ -505,6 +506,11 @@ 4C815A172CFEB758002A46A6 /* SuperBlockViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C815A162CFEB758002A46A6 /* SuperBlockViewController.m */; }; 4CC6195A2CEC7770008C1EE8 /* MyDressingDataPresent.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC619592CEC7770008C1EE8 /* MyDressingDataPresent.m */; }; 4CC6195D2CEC996E008C1EE8 /* MyDressingDataModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6195C2CEC996E008C1EE8 /* MyDressingDataModel.m */; }; + 4CEB9EA72D09643E00443480 /* UserRoomCardViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEB9EA62D09643E00443480 /* UserRoomCardViewController.m */; }; + 4CEB9EAA2D097E8400443480 /* MoliAvatar.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEB9EA92D097E8400443480 /* MoliAvatar.m */; }; + 4CEB9EAD2D09AA0400443480 /* SexAgeLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEB9EAC2D09AA0400443480 /* SexAgeLabel.m */; }; + 4CEB9EB02D0AF4FE00443480 /* TwentyMicStageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEB9EAF2D0AF4FE00443480 /* TwentyMicStageView.m */; }; + 4CEB9EB32D0AFCE200443480 /* NineteenMicStageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEB9EB22D0AFCE200443480 /* NineteenMicStageView.m */; }; 540EC1D02C89925F00F3BF0D /* GiftComboView.m in Sources */ = {isa = PBXBuildFile; fileRef = 540EC1CF2C89925F00F3BF0D /* GiftComboView.m */; }; 540EC1D32C89998500F3BF0D /* GiftComboManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 540EC1D22C89998500F3BF0D /* GiftComboManager.m */; }; 5412E0F42C4E460300FDD668 /* XPMineCenterAgencyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 5412E0F32C4E460300FDD668 /* XPMineCenterAgencyView.m */; }; @@ -2584,6 +2590,8 @@ 23FF428D2AAB2D3A0055733C /* XPCandyTreeBuyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPCandyTreeBuyView.m; sourceTree = ""; }; 4C1892972CF84349004D4426 /* RoomCahtCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RoomCahtCell.h; sourceTree = ""; }; 4C1892982CF84349004D4426 /* RoomCahtCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomCahtCell.m; sourceTree = ""; }; + 4C5C37212D0C1C7900BA9AB8 /* RegionListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RegionListViewController.h; sourceTree = ""; }; + 4C5C37222D0C1C7900BA9AB8 /* RegionListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RegionListViewController.m; sourceTree = ""; }; 4C6E1F732CEAEC3C0073D0A3 /* ShoppingMallTagView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShoppingMallTagView.h; sourceTree = ""; }; 4C6E1F742CEAEC3C0073D0A3 /* ShoppingMallTagView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShoppingMallTagView.m; sourceTree = ""; }; 4C6E1F772CEB12780073D0A3 /* UIView+GradientLayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIView+GradientLayer.h"; sourceTree = ""; }; @@ -2600,6 +2608,16 @@ 4CC619592CEC7770008C1EE8 /* MyDressingDataPresent.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyDressingDataPresent.m; sourceTree = ""; }; 4CC6195B2CEC996E008C1EE8 /* MyDressingDataModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyDressingDataModel.h; sourceTree = ""; }; 4CC6195C2CEC996E008C1EE8 /* MyDressingDataModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyDressingDataModel.m; sourceTree = ""; }; + 4CEB9EA52D09643E00443480 /* UserRoomCardViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserRoomCardViewController.h; sourceTree = ""; }; + 4CEB9EA62D09643E00443480 /* UserRoomCardViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserRoomCardViewController.m; sourceTree = ""; }; + 4CEB9EA82D097E8400443480 /* MoliAvatar.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MoliAvatar.h; sourceTree = ""; }; + 4CEB9EA92D097E8400443480 /* MoliAvatar.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MoliAvatar.m; sourceTree = ""; }; + 4CEB9EAB2D09AA0400443480 /* SexAgeLabel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SexAgeLabel.h; sourceTree = ""; }; + 4CEB9EAC2D09AA0400443480 /* SexAgeLabel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SexAgeLabel.m; sourceTree = ""; }; + 4CEB9EAE2D0AF4FE00443480 /* TwentyMicStageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TwentyMicStageView.h; sourceTree = ""; }; + 4CEB9EAF2D0AF4FE00443480 /* TwentyMicStageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TwentyMicStageView.m; sourceTree = ""; }; + 4CEB9EB12D0AFCE200443480 /* NineteenMicStageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NineteenMicStageView.h; sourceTree = ""; }; + 4CEB9EB22D0AFCE200443480 /* NineteenMicStageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NineteenMicStageView.m; sourceTree = ""; }; 540EC1CE2C89925F00F3BF0D /* GiftComboView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiftComboView.h; sourceTree = ""; }; 540EC1CF2C89925F00F3BF0D /* GiftComboView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiftComboView.m; sourceTree = ""; }; 540EC1D12C89998500F3BF0D /* GiftComboManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiftComboManager.h; sourceTree = ""; }; @@ -5197,6 +5215,10 @@ 189DD68226E1FDBB00AB55B1 /* XNDJTDDLoadingTool.m */, E8B825CB26EA18C8009E8E9F /* DJDKMIMOMColor.h */, E8B825CC26EA18C8009E8E9F /* DJDKMIMOMColor.m */, + 4CEB9EA82D097E8400443480 /* MoliAvatar.h */, + 4CEB9EA92D097E8400443480 /* MoliAvatar.m */, + 4CEB9EAB2D09AA0400443480 /* SexAgeLabel.h */, + 4CEB9EAC2D09AA0400443480 /* SexAgeLabel.m */, ); path = CustomUI; sourceTree = ""; @@ -5221,6 +5243,8 @@ E824543426F57D6E00BE8163 /* XPLoginVerifBindPhoneViewController.m */, 23B2AEC32A6516C200543D17 /* LoginForgetPasswordViewController.h */, 23B2AEC22A6516C200543D17 /* LoginForgetPasswordViewController.m */, + 4C5C37212D0C1C7900BA9AB8 /* RegionListViewController.h */, + 4C5C37222D0C1C7900BA9AB8 /* RegionListViewController.m */, ); path = View; sourceTree = ""; @@ -8167,6 +8191,8 @@ E82325FD274E48D0003A3332 /* Cell */, E82325F0274E2DE6003A3332 /* XPUserCardViewController.h */, E82325F1274E2DE6003A3332 /* XPUserCardViewController.m */, + 4CEB9EA52D09643E00443480 /* UserRoomCardViewController.h */, + 4CEB9EA62D09643E00443480 /* UserRoomCardViewController.m */, ); path = View; sourceTree = ""; @@ -10599,6 +10625,10 @@ 236B2E512AA08756003967A8 /* LittleGameScrollStageView.m */, 236B2E522AA08757003967A8 /* LittleGameStageView.h */, 236B2E502AA08756003967A8 /* LittleGameStageView.m */, + 4CEB9EAE2D0AF4FE00443480 /* TwentyMicStageView.h */, + 4CEB9EAF2D0AF4FE00443480 /* TwentyMicStageView.m */, + 4CEB9EB12D0AFCE200443480 /* NineteenMicStageView.h */, + 4CEB9EB22D0AFCE200443480 /* NineteenMicStageView.m */, ); path = StageView; sourceTree = ""; @@ -11883,6 +11913,7 @@ 23E9EAAE2A84C9B800B792F2 /* XPMineUserInfoTagView.m in Sources */, 236B2E4E2AA07D06003967A8 /* Api+LittleGame.m in Sources */, 237700E02BC7D78600D661F1 /* MSBaseRTLFlowLayout.m in Sources */, + 4CEB9EB32D0AFCE200443480 /* NineteenMicStageView.m in Sources */, 2331C1B32A60F32D00E1D940 /* XPCandyTreeMoreRuleCell.m in Sources */, 14A6034C29A35EE600D2A6A5 /* XPMineItemTableViewCell.m in Sources */, 9BAC92F528E6E63000147DD8 /* XPRoomInsideOperationCell.m in Sources */, @@ -12158,6 +12189,7 @@ E8B846CF26FDD96100A777FE /* XPMineRechageHeadView.m in Sources */, E852D74728633E92001465ED /* MonentsCommentReplyModel.m in Sources */, 186A534926FC6ED900D67B2C /* TTAlertMessageAttributedConfig.m in Sources */, + 4CEB9EB02D0AF4FE00443480 /* TwentyMicStageView.m in Sources */, E8B3E80C2848BA40009746AB /* NewUserGreetModel.m in Sources */, E85E7B4D2A4EB0D300B6D00A /* XPMineGuildRemoveMemberViewController.m in Sources */, 9BCB99A028F571B500466D64 /* XPMineCollectPartyRoomViewController.m in Sources */, @@ -12247,6 +12279,7 @@ 9B0E1C5926E77022005D4442 /* BaseNavigationController.m in Sources */, E8664ED927E4355C000171BA /* XPRoomPKRecordTableViewCell.m in Sources */, 238B37AB2AC55A2C00BFC9D5 /* TreasureFairyConvertRecordModel.m in Sources */, + 4CEB9EAD2D09AA0400443480 /* SexAgeLabel.m in Sources */, 23FF42762AA6E1480055733C /* XPHomeRecommendOtherRoomView.m in Sources */, 142721B229A7647F00C7C423 /* XPBlankViewController.m in Sources */, E85E7B6B2A4EC39400B6D00A /* XPMineExchangeAuthorityModel.m in Sources */, @@ -12282,6 +12315,7 @@ E8EEB91726FC7B35007C6EBA /* XPMineUserInfoDesViewController.m in Sources */, 544A36352C94160F00CA7858 /* RoomMenuBar.m in Sources */, 9B1B72AC280031DB003FACE9 /* XPAnchorPKViewController.m in Sources */, + 4CEB9EA72D09643E00443480 /* UserRoomCardViewController.m in Sources */, 237852A12C072D8D00E360AC /* MSRoomGameModel.m in Sources */, 180806FB2729A354001FD836 /* ThemeColor+Room.m in Sources */, 9BC8C83028090C9200C24F85 /* XPRoomAnchorRankBannerView.m in Sources */, @@ -12448,6 +12482,7 @@ 9B734F76288A92FB00CBDAA9 /* XPMineFunctionItemModel.m in Sources */, 541DD9552C1EDEFB00B616C4 /* XPHomePagingViewController.m in Sources */, E82D5C70276AE60000858D6D /* HeadwearModel.m in Sources */, + 4C5C37232D0C1C7900BA9AB8 /* RegionListViewController.m in Sources */, 238B37CC2AC55A2C00BFC9D5 /* XPTreasureFairyPrizeSubView.m in Sources */, E81125C4296E57B7000D9804 /* QinputPhotoView.m in Sources */, E880B3A1278BD60C00A83B0D /* XPAcrossRoomPKSelectRoomView.m in Sources */, @@ -12554,6 +12589,7 @@ 23FF25792ABD67CD0064E904 /* XPFreeGiftModel.m in Sources */, 9B92A33C2797E38100AD168F /* XPMineHeadItemTableViewCell.m in Sources */, E854103928646A00005CFD9F /* XPMonentsReplyMoreTableViewCell.m in Sources */, + 4CEB9EAA2D097E8400443480 /* MoliAvatar.m in Sources */, 9B8DE0E1289CF02900FB6EC2 /* XPGiftCompoundModel.m in Sources */, 23FF256E2ABC48810064E904 /* XPSessionMainViewController.m in Sources */, E85E7B092A4EB0D200B6D00A /* XPGuildRemoveMemberPresenter.m in Sources */, diff --git a/YuMi/Assets.xcassets/1.0.31/Contents.json b/YuMi/Assets.xcassets/1.0.31/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_at.imageset/3@3x.png b/YuMi/Assets.xcassets/1.0.31/room_user_card_at.imageset/3@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c2bba3ddfa8aacf5e6306df617364d62700b3475 GIT binary patch literal 14011 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/yna/UserCard/user_card_open_mic.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_at.imageset/Contents.json similarity index 85% rename from YuMi/Assets.xcassets/yna/UserCard/user_card_open_mic.imageset/Contents.json rename to YuMi/Assets.xcassets/1.0.31/room_user_card_at.imageset/Contents.json index 23d8051d..fa52775a 100644 --- a/YuMi/Assets.xcassets/yna/UserCard/user_card_open_mic.imageset/Contents.json +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_at.imageset/Contents.json @@ -1,7 +1,6 @@ { "images" : [ { - "filename" : "user_card_open_mic.png", "idiom" : "universal", "scale" : "1x" }, @@ -10,6 +9,7 @@ "scale" : "2x" }, { + "filename" : "3@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_be_manager.imageset/2@3x (1).png b/YuMi/Assets.xcassets/1.0.31/room_user_card_be_manager.imageset/2@3x (1).png new file mode 100644 index 0000000000000000000000000000000000000000..d57a6991b4b919c531dd042d086334853953ad50 GIT binary patch literal 5629 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 XgQrybc6FQ$00000NkvXXu0mjfgqFe_ literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/yna/UserCard/user_card_lock_mic.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_be_manager.imageset/Contents.json similarity index 85% rename from YuMi/Assets.xcassets/yna/UserCard/user_card_lock_mic.imageset/Contents.json rename to YuMi/Assets.xcassets/1.0.31/room_user_card_be_manager.imageset/Contents.json index c30d2fb2..3df53e45 100644 --- a/YuMi/Assets.xcassets/yna/UserCard/user_card_lock_mic.imageset/Contents.json +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_be_manager.imageset/Contents.json @@ -1,7 +1,6 @@ { "images" : [ { - "filename" : "user_card_lock_mic.png", "idiom" : "universal", "scale" : "1x" }, @@ -10,6 +9,7 @@ "scale" : "2x" }, { + "filename" : "2@3x (1).png", "idiom" : "universal", "scale" : "3x" } diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_blacklist.imageset/3@3x (1).png b/YuMi/Assets.xcassets/1.0.31/room_user_card_blacklist.imageset/3@3x (1).png new file mode 100644 index 0000000000000000000000000000000000000000..b38aae6828e69f88263c9447a9de8652825431b5 GIT binary patch literal 6110 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/yna/UserCard/user_card_close_mic.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_blacklist.imageset/Contents.json similarity index 85% rename from YuMi/Assets.xcassets/yna/UserCard/user_card_close_mic.imageset/Contents.json rename to YuMi/Assets.xcassets/1.0.31/room_user_card_blacklist.imageset/Contents.json index 612e69c8..3aacb355 100644 --- a/YuMi/Assets.xcassets/yna/UserCard/user_card_close_mic.imageset/Contents.json +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_blacklist.imageset/Contents.json @@ -1,7 +1,6 @@ { "images" : [ { - "filename" : "user_card_close_mic.png", "idiom" : "universal", "scale" : "1x" }, @@ -10,6 +9,7 @@ "scale" : "2x" }, { + "filename" : "3@3x (1).png", "idiom" : "universal", "scale" : "3x" } diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_chat.imageset/2@3x.png b/YuMi/Assets.xcassets/1.0.31/room_user_card_chat.imageset/2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1bb79f19ce511091a70cc661ddc86dc61e67e0 GIT binary patch literal 12647 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 N002ovPDHLkV1jaE5)A+V literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_close_mic.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_close_mic.imageset/Contents.json new file mode 100644 index 00000000..f5b6975c --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_close_mic.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "5@3x (3).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_follow.imageset/4@3x (1).png b/YuMi/Assets.xcassets/1.0.31/room_user_card_follow.imageset/4@3x (1).png new file mode 100644 index 0000000000000000000000000000000000000000..694232a3b09fbf20f8bfa8c9ce4e4b4a2538413b GIT binary patch literal 13079 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_follow.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_follow.imageset/Contents.json new file mode 100644 index 00000000..18e8c28b --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_follow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "4@3x (1).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_gift.imageset/2@3x (2).png b/YuMi/Assets.xcassets/1.0.31/room_user_card_gift.imageset/2@3x (2).png new file mode 100644 index 0000000000000000000000000000000000000000..28d682ed6123861cdcc3b4b5bdb7b6280ba15a8e GIT binary patch literal 5033 zcmV;a6ISerP)Px|V@X6oRCr$PT?cqnRrdd#H}hsfVkj}BP;7uiK^B1p8%0qNR$T>T6%i{%7M0$S zCQZs88&cLq5z8XBzXiKsC<}rGL{PecG(r(bnRzqsZ0-w5W|A3ZCNuBNMCN=SAK#aG z@1F8|x1D?LIfQCPyoar*i&!`jhay`XBvT5ATR=r)NZbgZB!H6ussSL$MLiq9Cji*M zlmUs3!^sC>q6{$YhRLx9lC=OPoWWk4p*EycC(}@M5SBAJ5oX5~aBwq7xDudC0lox) z_;*2wbjSxI14Mg4*bOJ|gPC^1VctdcC@(}jbZaJ}f#k!5ogth0g3%7Zg#c;-h|$d& z?hO|KI0fdD0BtP(cwVJcd96Xb17;I3K=LX!p)=y3*e?d57eIZ$XdJLcy1qb1z<3#? zu0{>Z5!A#9B4S-x`q_9y0Ld8z^WZ3yj%M6kURKvMvu zg-iL6@+CR~Clc(B$(+x;wHY3Y%EhL@2_aS> z+MKHeR4hd1_R)cOfcyqh^PT1>4;9DGJRkMg=>FZ=AYlaR%1iw9&H4{yrqUjyz7C>> zx~mao0F)e5-%Iu6bbrj@7m%FsM*_^T%Rt=2pGKq4gv3~EMBuNU|$PR}CCX)$7KELgtc?H}6BON4nqZATRdmhQF)S4f)gSJZj zzYvDy2dqQI7ZgRowjJMN|L+HoeKZFavy6l~3Aie)x%Mv*I(7OKzW@0L>^pP-Cr_P3 z4QmWilT&bYvzEA|p}36@F_aG#Be7my=FK1L9mpI`hN`Rv;f6?2=SX%Y<}RL(?Ynm1 zOhGwo+PQVZd?$eSZ2 z-X_1G0Apv3$A+z&d_pefxjVYthOv*0f&il;?LD{;Bc_i=M&@CkZIy!At9uV^{)_eA_ovUu!~oMWF4#_$Lb90J5yFV4ZIYd?pos%|3Hh^c|XqQXjIis7(d&-*as zp}}sy9Y1*jPfi~0u~&O*D>30hJUwa(+O}*P3FZJ;9Z9J%l}5@+K=P5IrZ7pL1Gp&M zk~^JFyu0RoEPVNSH^79^@9%jZ9_rl>c16M5#S8H1H=jYQVoRxJd`(OqIuV_&?Vznh z1>mD+jH}eE>!;Mis6ivpq1_GGb6^i9&6|qf_V001y=Ak%;OS9QQ7<_)+$ItH_d{`X zsCduB4M=7tx)-5xdJmrPeXFuWUPGmbu3@?Dhi9lwZ{^QzaSpthm653?K_ukVFZ{H=T6l?b)~;` z?uN00MZ8?V`$W-ba$*uDJvm<6D|++fh<)WdYu>~2%NJGZeXhNBv8{)rW^-3&xeVN-_ zCIlTha2W2nqqonVP-L@V;lG~6s*m3Bh*4rfBIZw;gXT?}`EEP+^&{u$}I zHrHZszkv`dX5ESK3ME^FKfGjU)$-VoeM50%+~s;Q7d>&}+$q?!?Z0KdO+ERAqir$t zUfcQ_&57X6O&CJCc0rXph&(_gK;|m#q4MeqnW93-ucWCj(!au(nc}|dpPy!peHvn` zq%-A0qF$6Fr=RVS_Cb)e<0@T~5j{L|0Dj#0Q<-k!i|x{(GwRf;qqDyHHlLGs6l*uF zbK7?cZ_vNzE!CGXPy`jjsGemp@m7}6&@mItBlYIm@$Q=;mi47{XV<@D)SzJyF1PAT z`33oyzw}wW|Jes+Y6utM+Erf|q1N*_Esvs-C;-O_fN#^AYpZS|6InS8yzfyA?Au>& zwuZF7WaTm}dHr8*yuM$v*#O@35n{~!h>vkY*p<&g`scfe0;vnGKSP$g5g#pT3a7Nq z2q$?INL_$D1E<=CINNa>po#!1-6;yBP9|pRM4Y3H1oK>-ShzJC1yVOFKS7*ne-;v+ z(2a#l!%-l0va*WjM34Lc%y;O-BHAO3Ff90E;w*c*Q6Z1f9;q9u-w|iq4gz$sZY*3H zzW%OGZm~Ca-FhcRKQ>&8C9Te6v)k~@OAGMcr|*}kkx;u1zI^jjgVf?f0>~_YQjFj@ zXxu-s<;SgMtVH}vw;ONO0)h)|<*_v40TJ~bimL#j)JsJ1d6F|HFBczv`LWw^T$>iH zuyoE#p=5uqwsMKH?ZSeFbcwYa*J0e8iLkkZPZ*`Ck$gl9?Bt;naNEs)GmNbO(y-*} z;>2Bq8>VkrZiXs?8h5{*65@CkZpPhw02lhhDEq^8wbA4Ll zrWikDG@4vm7KLGmiiQIzw8}kJa_qD9r)@ZTJP&`IK81rB2i+7Fx1mboRt>R)A56rQ z;7Lx=^HS<2qt#Vcqx+5B!V&vw6F`dCLBn&%iQ7-&_(vE=T#*|%);+v`$?QeAxIx&1 z-QD077l}N{DI)4(tX9O-O{8i{C_}i$!L% z$f3xUQ`>&nMgFtDhSOY;Yan;4M68^Q^`b|91dws-WDj3V#2ToAtPv|G(f=FjG>;Cg zI*ogp(>&Y$IDqGLV&PY_5&NZApB_1iI7{gW;;@#}ivsD__kNCtq}%E2#a7_}4OKzS zfTfB88L-J*U&x0^Z7qVY8bDFj00=C%Nl?72$!f4V46Tgau*h8u4Tp>_c0%~|mo-%y z4k?OH$15UcM=W~6LeZf$2(uH-Lxy?0p;rc?Ju(QuJil6gWkCFH)FqxMkRb=M;w2tV zgrs~6z<^7Am6eGOtyKh=`8TlT`m$?vTCdEpF9+*?(bbd4Q6Q@dBwnFZmy50%kcSI9 z!)*GpicJRf+JTINxaXgJ-C|x=Ec~~2&p(pr=U;cC-_VE4L=q{^-gENv0bq zRo0w2?#Uo>?0djyY_#zXXC1*KBL`@Q%%wDQ^fcUhV^^a^IVV4nj8NpUE2UcTweae~ zmvK?OaHM&sBa|XHD3zrGkhZB{GCVzt$cr<0!s9rYaj48lBA3nVaWf(c$g#5~;PY?G z2d&1JG{W=K7oIcCi*5=qO`}xVTY45PVbTVpYaxqB0g-m|vvuVcL&dN)cfu@mXeX-r zhMz=!*D*6ExWyUW+NldBJTVS&H4IN{mIv@n-V-Jr~A-(hmg;ev~+4y z7ldP26?x5vB3XW!h{{4)E2sGsNq1$l*i#xFFe8#DiF~RepadMDvsn zR>-n+&LZvO3IqKPr`m<;$NcKb+jHXGtfCPhX8{}EJvn{0?H>TWrK@0G8W)#kPW*8aU#|Ze zAAR{TcJ19=DGjz!a)~^1O&eW~zCHS&O^ep3Q>%9PE*GgZg6hc&JdPIL48o#Z1eABc z;V<4I%0wK_I_z=2(i2dT$Vp_A6zQ_VPK@=C&izhG`ajC?!Qrpn9tvo`Tr2#T|nn*bJ9apTWlJBC&B zd_ca2Qm8!puLp5_0$I{CZDRq7mK`)6&!Xarpi?PD4!-Q524pU$Kvh-%&^>RZ@wSR! zj!f^uQP7_n);jJ>O22xf2Bs*@Yr>n6QfA4QV%7e4<_xfOUr0;yYCwu&*+-RuP$A0s z7?N|K+JjMb1;kbE$B`^A4|%a{4NOtKzFv!GAYo|LWsJV*+X6fThj&cXrF?xUbI#xd zSR6~hd>4R-DB-wEUzLH>z|69@ z1>udeXO}^>RXvQYi@cZ_qfp~2E6;u}>H86#5Hp_7>2tz?EYBuXycgtUe!|WT`Dh*87LA#J|9*f%jVA`MNMIn+G}T=L~Q{i2C0|cub&3<8i3Q` zP~Yx&YLD&oM8(^%4Y&nFlkZ<%5 z>dhVz(IdSH$5~1zfFA((IuO+cAnGp|wI3Dxzf;ArGsi&K48^&U8r1kIqCPAaVImsH zvY|JV6Jd5-0S7mOi5h{C2Ij^f2(MA7t}}?Rd{JKNVDZOu04jcgnRdcq-X-$bL@I!# za#af;-4;lqxOZb*04FYhYKw)_+@$yjEe%d?2oqfbl@mZL0JZ`o%Bj2hdvgIU1W5d! z3zhak!d@_Khw98mj5Qx7Px|aY;l$RCr$PU3qjARo4IA>LieKCrAuyNJ16`gaKIul|daG<*2Br=s2i29tOn) z4g+o|DDE>V=%_~pK1IhBWEnTqVZ;R)6$1hWLnP@Ygv}UPlJ4wX_v04XIt!`pR8_iT zzkiZ*`n`9TU%lL)u?L0RabD#V+}u2|LJ!ot;#aR!77A%OMnF?vpcR7G!Fb)&pe_*_t8cUyBMB8sNK?CG+X4_D}u6U55Feb8sNnm97 zEs=>0h_DwbUQ!7wqU_k)2RKATY$8eBT?Yk_Ii;K!>BVIrjA6zFM2OWbK|54rK&IM_ zq+&II^=WaG(++I-kZe~Ve_@U-@!&=x+`^1rH5-)n)`@QVHS6lH09I6$V`0Ap+N-;< z!4)kBQl`)m9wd;0b6CZE0R0V?sa?90X;)<|B;buqJBqF%@>{bcb9(0)D2Cy{}n3fz% zSyu31I*=|m_f&zufN@W-Z(>YPxQBs<%e+`Ts0$r5q5rxrO#_mdBU~jo0}AE=7-Ql2 z&rE#<(swyA)-dDg)L48?baY-ap_l?>W+q1_48V=dn8QG#34DiQmtr+~=wLQpF~j_4 zIFJQLIKI+`c|^Dwj837banpD{X77D6QpLg~gQr?Ufy_O^8A=2m17o6T%IE+cGh>y) zxHmP9b{Hj&VL-Zyxj!p-9l)soY(_EI5&I#)%fL2LG07+}+YF?3z%RpasCeJ!+NdKU zV7yE&D7ZQ^8k^c`Kxh+?0^(^NoCm^l%t$w0&W_(B5%R#e?K?Zxwgt>K0qHE|k;HhD z8EM+pZMX!Y0VaZz36s)dXk#E9NSlC_U$Z8z(Jpzz#Rv@)l8UnfT{8m$vIfLA0Sq-l zf^Z*o8rY=@*bL0?bZ{!6Lo3S=~T7 zi+Kzbya6Cd7c=2XZPEY%ds)Sw)8c5oo{n?@nRSHY?FyDK;c`8lhU*xnfwcroPIb_M z)_T+hWS*PvCgA?x@Ksc6dNk|zat0nqchKKkBhV_4yGwXbHQ^heW8dnxrl|J%of#z@ zfe9JWwC;F392dxZ=C0Llyie3Y{cG9_9Y5(ZW4+sh3x@P0PfJZ(1X44Gm*NIi@f49U zZux%lAFf`b0dc!jRouSGfh8^3V_O8$>E<3FtN`QpVT}fX1_&F#xFXF#KR3rsi$LbN zc@_Z+%oL%jvJwZ2e!(|itV4d@Pl$@@1Y1OenIv`f-7~QdPC0cr5|dNVIXXsH8!IZ2 zf~!+wXqj#xbBZ`IDjMH1o9Ay+QC@~ME8fPMmCJCjsL%>M_(j9+h{dS0$KuNC|BCLt zg2wG=N30zqyAhQ%7N*$|>2$M<#94kx?q}t1KL0PCdE|Zwput)cMZu{f&%~?;9z%3Y z(758>p5~w?Gi4JXoyFV_3jPBi*(?QDR#afxl^5a2AyZvF4Pig3QzzUoeKyX!z z(&gbjW*#|ei3S2>@=88vpcCcOX2`&Ksw8K47^xjmCL`? zK#GjZUS5RdOBeY7w{rdFW`X?t;}5WS!DE`$NscjpnlcTSU2_8j{2(iZuwi0aG_BWw z%q!t(M0m<74}f3?QULt?;}4O$V>`rve$Ke@II(+=Aj42&r<@soOOK@&Nqdxf3LcgF zE~_{Vb|6I$a)y=LnaHT9U>u3{P!XQ>?!z4`K}e&od_GmYepCFux2$_-9lPBwZcC8JB%c(cK3 zv41AG$%_$`=i%|h+9OrVN~i-_RQNLgIldH5FXU}PmY4$^MdU(CnE{~xOqm}VLHPS(g>08)$@ zYx;WW2tbPcw!oE#1^3;BJ^8Noo@Vo9joc4HPkj&=Q!Chkl%qxQ;X|5rr?v9){=Il& z?j7)y)OlUhHPNQoizYz46HG3JGPRal{ctsyffUEDHx@mIZJWN;OmupR$6W$XNfTF7 z&1Y!ZopT{RKV}=;Wop&$_@YND9d&{k$ah{@3^`ut8I7%pD&B!-kGn{7EHm3ED_ z+hQ39!pDy`e7LePdhLa0@X5d5@##gp3I+}xfx8}CsM%sIDEXA<=8XiLW&yD}62U$q z_2@!CeEa`iz$fpn)SRVji-0ITK2v7ifvzWZ)6-Sk>kz(@5%~dti`w3s{vJ94kmA#` zZq0i>Ac_VCj~Im+b04%0MDd^_ycaf_>;L}hYBqkmB0sdlbXw237|orfJRK^Y2|%8J zn}qs^eCg@Ov1aAl?K_?NYX1&$mGIe2ur!@sr~|nx_b1H0;p#e7w#RhZ5Jx6lO!Bam zZOAk#p{AZ;8tOobj9WJT51$?Nf9>5T8JAAF-m2Yc6ZL9|)@&F~J4?BbO@+8s57GmI z5p{wcNHNdJIdaDjTeSEA!_FA31*!pjje>ndE`4?ZK3Fb+Fpm{^xpniM^AK$hnt%{> zyeSHvEcy}mgr5vF^C5=HvpSzA10qNG5sxpLAq1rFBOZBHSE1lb1_lH$Q~KQ`*r(Qz z0g~}kXU6EdXLW)^M||ko@C)ngy=a?A7qf9k7BA0#E zH1SPsoSn_zY^dWe7+)+)a_&?+^{HjjH>!t4;aSA+=(fv+M}4{^bGV) zNGpd}_q*|D03A0xixx16 zvBB(I$YME>cluv_`bo3Ai^rKbE6KU7>xl^%FnFjIN<|`A1sdG1IUw~Y&Ss0iq^Y;! z(n*sIpC$CrZ>|mlMF7UO7%*ukbDYfsiI{LzphWbxlh7#w=7D{CbVslf|Iky03`76H zLosOB2z2YwO9NZLm20Hql|X^)n{l!h#w9ViuU^qiugAceC_Ao8qWT2fK2xg}{@RV3 zL3kX1sXhuaDzmq4#@hE+WBd1;{Epcwz$NtPg{0IpB=t>0&pydW%{Uo7`y@3RYAg^S zGx`tITp2S43^W}ay#zEPxfe52WAPFZ)w!}ZiCdXd%85~oFKbc>>g_+Edg693fs76x zI;aI+kU)apZTQmf@Soy8DsL0*v9XAa>w@I8jAMZWhmFv{mh#q;=dtSbmwot*@7C1k zOhTN+Cv?N_&mD(hr;kQL4@;f!_2_XoRGgm{M>!2Ew-k7HHh?Gf^lEgShJggPW`2Xc z`7SL?nFK!)SAKtrOvSxZQjwIBil2VWLgD`UNRtvN^2K*P^ryREsk<=EL4uD@X%@&| zm}5&kkiEHOaRr)P)Q`pfvk>irpXkutYZZ6HB;YatHAS(`JlHS=3tfdm_J7N5`^a~C{^ zlr+Nq(Bv|TkqoTaL$&OgoKZ#;B zZoURPcA+q%V+Z}d%M1(PVi3U?W**Mj1k|dvq zczsJGt57S<*bw2s#VJIGTH?Lcu=%-VJeI2QZ?mmEp{865`SnCFPEU@dtmDya6-a3u zPCIBJY`&z7OFJn2y4>88fqwxwuiZrY4H72CDvye(gSyn4;sTypYa2>xUQ+ND!@M+0 zzd@{yCvpK)Tw`czUZEz*vhz!ElPZbN7(wgg*&#j#f|#(Tr^aBZ;mNW^K@!`wYkxdW zz|0PzuwWH}@yNj(JYY)t`dXO_j&OWc1QvmDnLI)YR$YW5Uj%qn#=B7}rY7lF7aPi` zYuDOXDY-{DL$PV*yWydzups97dr~neHI8=p%VR)5YCG9t?#~LousZ&LzXFC(eHW>? zFc1($#(;s8#?De6NsKpZ?k?NZR|qNGXjYjBP9{uBi=n38U^=O_N%>-rJNHRY1s7*VV^do| zZ1dFG5RjTR^GyNy$d4+=@;n~!qp9CjO$V}; zqunJus0xr|8AFKR@SD>RY9QX=s*24Vf%zHHw9X3FEdx@7sY$4I#Ze32^;Ty#utJ#{ z4Z;Ri@w(fC*M{^Yk5zOn1yY343ZL&@#3MvgKf>}SUFv34x(M$|Myy}yVASifC?tmRq4r~w$m zigw32l7NH&<*}rhY+{J;5g6;MY*^hdrl||RC5$v65)?qz99L)$(6!QoM1?UC3Z?|z zv`fe(6>q9ynXx1Pd%$D$6xz}U5;Q>Kizg6c^IsX+C@GF3C zRp9k>2YqVwNYhI%sDZ2%LgE0GM`8e1W1!83bd}Lxf>sbA$*6TzOQ^}%1%jj(aIuOX zDFWL&S0P*C*yvSgd({gGAR8)2%zxd6!x2#iM}>kI_TnTu25b^3=*vL7{IA)06?AQ6 z?=1vS#y}wfg<#~thFtPu8#4}gBjAaOhNm(Yr6-+4{yoNQF9d7o{y*Xg^|5dKJB|PV N002ovPDHLkV1jFUYaRdq literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_kick.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_kick.imageset/Contents.json new file mode 100644 index 00000000..6e1d814b --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_kick.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_lock.imageset/1@3x (1).png b/YuMi/Assets.xcassets/1.0.31/room_user_card_lock.imageset/1@3x (1).png new file mode 100644 index 0000000000000000000000000000000000000000..7ba302e2ab2ee9d3c0f4b06aae7ddf29bbadf9fd GIT binary patch literal 4978 zcmV-&6OHVNP)Px|EJ;K`RCr$Poq2ptSN_M}-IznZjoIedxgmyNH z0|@&CmLLCkK8TB!g%0udm`%U{Ib((jxuQK4j9ls)LT6>r4P_0N0aFBaBD`znGc&wA zJL^_vpNObH5HKKs+?1l~ghg;SaGiqN1S$oBaf*{cfgWmq5n&dvBtBX;mA1U43S>rx zs&vq#mk3WNMJVs;$AQ#CXp1&PiO}}=m^2J% zVy8l-MN1F6rZ7=VK3TPh%r0Fd-$_{<1#(@gs!&mQK!onVHBKt(Ag`sEd=OHOuj*G7 zz1?x7I0odFOw~?Ih8b|Bf(njkS4vD290Jybh4NUvNLlZM7=8ybIbGE>;bGv#Kwrf8 z!QgstI_hW+)0)Q0UO&(;An7+Cl~SR}8C(Sn(W_Ah_kaGhmp8Pt1?DQ46c^1;B9i9~ zk&@c@1;|yaR9I94dMT3^6x1n6hzsQR6ii0$-NF0*aR1p3WJ-#PJQl$afyaS}3j`#0 z)y%F%`uq+F2_daBL;Tsl#D^wRSQ_{s{_F&AT@|B z+j0}|rhcUEi$RKqjRt?fCu#h;>t#U^O2spbx4Q+!tR% zmbgR4Eg;vYsK^QtOh4|8xW^r$!8*2CVE*x~$%AnPdLx>0!D^{jrrOMQaZ9r6wT7-m@2`^%{g5eEo$XK6&+`d;e&CBCw z%D}1q+SSXM`^^{Z+_9BI2eZh{%_ToC&vI3ShK3Ou8cO+#Dp0F-J?`lI09UlQx+MFQ z`tJ%3DucTcqGZ9jggIxA+_qm;%R9y#3E=n|)66G1@xOfb!4%f4T;`GC+ueKz9XoZW zZoN1RBXE1Df+dGcZfjOk4i~3ju|QhR@ayTJ3|_MqYRDIE1GyucIuE7Y@NRM{^TS@FX05vZ#>89t8!HK|qNC-E zA?U0K+74a_%0b+wI(*%qv6tl9pN+ z<*&CXci;O6_xE_x-zs=dUojv)M$Q;1&j2zhLp28eg`%GK-2B%vWqT5Rd%A`M)rhH0 zzrkZ^)VQffjJI!1WXzC0WTfwQX*cHbI`I^5Z{#GZIMFxq+W?W|9%txN8)V+B8V>iQ_%0<~8v zjv@?PwUD=pu3%k&OvzG_$8z{cphF;jjYp3h=EZ(J*q&TCH^$Ve!>9@G5?Q_IEpzv! z*F)>jfxXE{+f~pgKA{O?CVfCySeW~SoUJ({KZKr*s!PF2&jrZDRCO5!3k0H^mCHSD zDch15IrvHTWE8HzuW#RhX9kXPk3ccC#trY!ise5R{2Ez3niogBPFzA@UKG>b9!#!j zSX2IUN@y1#lQYzCrFhvVtN5|;hV^TCb>slD_7`5Gc(`|eI^J`?Ph97G{R!{CUATUz zQZB$aJ+MP`4af*i}C-=8ach=Fp+Sz2ktF#`)}( z`Dw}bj2|_y05R=gfBLx*v}k>OV4`>exh?V0(&!8zlQUFXr6?R<0#JotmjB3`6NYj4 zP~kS}`JoeOb#+^xr2S?2LjF3uaJN;VVkMsHKg@Ct1aeU(H#V#(Ke+VB8o!X_=xN z#Z-G+va^qHFe}S)f@>eDQiYxyEzG9h*D-tMhh!f;S|D4O2YS=wl4d^1y7BjQ%=qZ- z0vhGYm*>vT57PKFx*`UZDp%p63Kgw`YW-JxgG#L^(h)lAa1cw1#5DDo2(Oh^1b_x@ z=w$(zqOk?@$9!wvLFiyjU73>=BxvXoMJBR`AhL`MPS z=kg(n+np9fdsSW=^8%YUIg&5IZ|Z3u@3Swyf_B_HUW9K$!gx@2?oqKh`TWc2d^b8M zYWkaFS-S8aE~gl$454FdN;<`G+Gu(n*KWeoi2O(}AHr>-Pdh}h z+G!{GuPc`^ZbW|UczdU9N zmt1zGqd4kRFe0>�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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_lock.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_lock.imageset/Contents.json new file mode 100644 index 00000000..89d6af5f --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_lock.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "1@3x (1).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_not_manager.imageset/5@3x (2).png b/YuMi/Assets.xcassets/1.0.31/room_user_card_not_manager.imageset/5@3x (2).png new file mode 100644 index 0000000000000000000000000000000000000000..25053baaa9540ccbd45616abc9271b29bced4c8a GIT binary patch literal 5924 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_open_mic.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_open_mic.imageset/Contents.json new file mode 100644 index 00000000..903ed6a3 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_open_mic.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "4@3x (2).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_out_mic.imageset/5@3x (1).png b/YuMi/Assets.xcassets/1.0.31/room_user_card_out_mic.imageset/5@3x (1).png new file mode 100644 index 0000000000000000000000000000000000000000..03fa8afc2e1c84e1acbb26a83696427868e1faa4 GIT binary patch literal 6399 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 N002ovPDHLkV1g40B8vb3 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_out_mic.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_out_mic.imageset/Contents.json new file mode 100644 index 00000000..b972d331 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_out_mic.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "5@3x (1).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_report.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_report.imageset/Contents.json new file mode 100644 index 00000000..3ad6e843 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_report.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "举报@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_report.imageset/举报@3x.png b/YuMi/Assets.xcassets/1.0.31/room_user_card_report.imageset/举报@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..40109668399cc37a275dea50eb055c4004bb1e6c GIT binary patch literal 2426 zcmV-=35E8FP)Px;G)Y83RCr$Pn|*LxRTaR`xo^{KmSne52FjSp)af>WmfiP}7-Io5IH`r<3=Al`|;ksw+YO=`&TA=?tSO{_T2N%J?AchKk5=dpHF=PKA;93;sf#lxeFq` z2l*c4dyqQ+|e8t`O?|$}@dypha zTLIvD0O$pPVA-TRBECRG_iCEE_LBe&&(^k|b$60Nf7%oek8_0l;T9O?$X`Gn=2eB!FVE*jhmlo&kX6HdQ}m7{&$Z zbowQm@}7w;I-poAc9tLrKLvpIEm(nw1`$mIzz_NV5b;_f>IVR3vGf_kFs@9e)317F zy^Vzy70{L~TZH4skADmizge-h{wfHXu!Y=_JUZMRpnx-A#Z+QNH4l(~*Tej?jM~)nM(G%-! zEV7t@m?(;OBI0cpy$BJXR8@6jHC<&{eu#*8Ft?7qjImpj$>hIn*ymbg(E!P^d^r&v z1b}vn))~VvK9EkQ=eJhnkYzbWM85!lRhD@5ifNi7x~}v8w|p!Lpm;p~W|?R(Q{PRaLp+ z4TmU-S24!+5mA>#_<2OUN>$Z#!v$Ojv>cEu%TJVYoDDp^SZWMx#GyRc_QWK#HPVXqx5|6&&zw1Pkccj^C{aYjn^aZ(PBq08MLFLz&BraT@&sdSQ!<%6 zQB7Wwq+N)(hlmymY+P(Q6bilD>)gn5K%yveci&lY5z{&0sEz3FnCd;FQ$=Ro_J8%)xQk@qm~EqI?s@e31)y@> z=r;hsyCL%f5qZGAL(?>V>}hH=4X8$M>!fL#8&av%ADn381t9)BS(e`c0Kcw0h7^m% zXtO=FrT|szZI#NR{LuK_U@*9AYHEtV!E6t&0P(sJ5#0^|w^Rh|rh96R0oCbkWf)@{ zlgZ>U+hoduUIF6EiJ~YXBERr(p+%3TduomW+3jsPfh5avw3OUUS&j`ef*@R$NF@H| zWF0Q+bx+MHAjiEeI|lOmL7knQH#5dQ!R3kQkzg=*kJGJceU?`}HAjG&>228o#ASHG znakxa;(vE`c0T7e!Skx8W*bnmy)C+?3y>GRt$LOY4-YTT<#Kn;&dz>>hoJWM_J`Wr+rM)7@Zqd0LjQfM zx$3Fe0^~(+tDd1FBO~uRdi3biD^{#%=N^>HiceSPyK*F+*gy}iA|2M!$Ib!yk6PEYN+Mpygl0un`W6=UqFii=E5_qJ+T zIy^kQYG!8U(PFVUfQT3lhmUo4cW>Oke}Bd`o&V=X)p}}rAP~5+-eI;bAX%3ARXE;> zur}&k^|q=Ryl2lIrmAXhHk;kd0rm9sJjN@9PMeGMU{>p?@fH&R+^A_9uY^_|H3601 zTwf!iFIZ-phGE2O-RJS*+iv9=eSLjvOE*f?imNnxBaz6iTDL^%0pdk*UdouyZu#I1 zI#pG}tu&(5YfF;!&x%gSgTY|%GqtjI#~#EOduKA4v{fl=wXsguFQ+RhYtIf5?+u5; zUvlh0{Nb`J?;s+6+50t}3IMo`_pyq_qOI#IP7U!|o-r0cM2U#_m7D)H7Wj@R{VwGC zdOvrl8>9yY2D%G{LbY3|UfZx#>-~|4HtD+lyyGCf5O(76_z+{v)=jXbva;Fdnx?ri zl}hnT7W3DStBpp9;`|&%QFfcA`MJ_>E8f(sGOwd~9L6a`ykAw-I~wU_7f_pF7#kR4 z+lc6509aYhjcm}i s0=@^iK-j;DP)PyA07*naRCr$8y$O^h*HtCDZ;WruxiV|Yta+3y$<|<7GD4PAl7%ORW@>B(yBj{n z{=j1B?oZRbz_jB%z z8*$_1%Tfs&FfFfiX1yU^yoeq9?6c1~HyHkR{Z9z?W?U$TjcTbfWI1s!Dgl-qMV9B- zyc#EBhYhv~Hk)FMPlB^C23}`iRfuGi(SL$hA;d6a%!S~?i~$g$!GI6|w;+OszaXq+rJ!9-Jz_&x70)`R<$^bkGg!IG@0uVh( zph_`P0MKC2Xb=)8jlU%d`oN{PYkr0XX8Kx5fDqgQ>jAtCupVQgAvjJ5!TwG#=Yifx z`|m%^t|W&1SM}ewJh1K(!sngNSmHP%Hux(O;EfD;Eg*JjrXfO6UqmsBVi(0WIiPX? zWo#sYmp-nUivUC0$pDvv$b3u#gEmjV$yiVAh}ve(azzH)=yAQ@MfL<^J#g_Q#_-n+ z_I-?Z7J_JM<)c$mos4q71tIq>39MU$DEVQyCuaOQ%VO7oiyH*kZYIQp!jC>VeSd3k zX`p4VQ$SH5%fV0xb6H5!Ax;A>1&#)m1YRB@6@ZGb&DqO%Zy#Ibp|yX%XkRr0YQ(7R z2(ZWkj&gy=!0|AH^(`uCvglU#yr-y;n1v{^EL@1%{EY>(f>SNY}HG0W5m2M6Y7Q0_bE|)WA0W){kjG zrQbt?F9%J|t^f-FEDJ7POkn?!?ZkiZq2Vi+zf}PCFAFRo*j-qzbJTamaq@!z-o=1A zgt1$Bbjw7xzM?Y*N`-YE4RevL4zwwjU#r_Z?`d!N{9p6&lzx*qV@qa0x{fhzXR?*o8 zZoQca_U#aYbW=SCMtV3jsM6mB#xg^j22XYrH9O@Dx1O1b8DCL%r8+AEYzm|d5XBH@ zYN(9qQs8O8>F}5{W`DM6YOnnB&HYkfQx}Tt`;je&PW?-O z>z^H1ZxN#2<-w10uy;X-Eola4gs;J%Qen)vS_`4As6`5TO0z+q#v)eC^pU|%`g3F$ z%PfUF)LH$SN^dvK{tDWO0hZuO;2U91ZCe4$1X|8g>owb8P?^Uge?|J0y8>(umi=MY zZGYhIt=BF7a{}z24Oj%IP7>Y$hF^ogL3NysE3c28jEge6K(j0`yJ!tPW$KdjB&twp zh~q5eq~S5$hdhkwu-V5RI?GD|VhZ;B??DWt!DEI-{n>r5mti#zuQJRHND2xeG7X1= znLa>%fmLMuRCxDY zp(cwNKrL7e8F((uYSJ>u7;)n;WroyCgGvKK$sE#S+E>fOeHOw8+Y>SjY7IAyYoC@^M3`r^qaXyfkSyLTbiV*@-gQ%FOoEXIMt2$B=?% z1MQV(mi@Lv3NoF=rl1=f3ibXNESr8`)BIf*=8ObL9cCuoSOKi^#QC`GP5tM)$HvzF zslwww39uwfh3&(z-QNeq_1Vs+Usi)F1D5uea#B%$tpk@~8JO9k`ND$TPy|}0n=(_B zv`>b}+|)F5lg=135Uq36Q@xb2X9^-p$O^WF2Gd}WX;7()WRUji1D46K20FBuHxHf8 zvek8`;Lc$^E8x9*dScI4e}%F5n+>pUI&@2G$scIInpYleOP@+DFN&vDvsV6FGT3>M;5RJv?!J5Lb)9b}xW1{tk^-HF?-v5! zlN+0+E=qw_NbXE=J&2{u$4vXc44b-?q7OD5wDe%>@MxH;%70RaF%$Qf&{zc@%*^oC z)&5M8z8)}^A<+BvncgR@#rn%YX=jD3QLeWj3j9=LdVMKphQ8sr(SPh_g)83kr>bj+*sJ2ky^&aP!{zZw7OHQ-F1g2o5?4{*wUyEdXa-7&F)+bJYv_ zX)w6VuvyStDGMpa=@({ssLh}6W2p37=PfTrDac@<99;cOWCEt|@2o(bW^@_I2C$g~ z0ncm&GZ`>_u8iF>wlXe&jZ9Mm9l5I`87j?jQh3ULGji_vKXi$Fs?{z3$|rX1I{J-* z>l+3Zfyz$sQ2?(3p!`EK{L8;D#aPCR2fQ}}P63GNdvrL8XGpsEOo37?dq4py>p{%oycCGngp{lBw$mfN2=aEQtKr6||#?3iHs* zm+P&hLSFwnWiBr4N4mk#+dr{u>o)|hZwOcv{+uNIO#!?O0#@Ptn&2{w(1CTpLC>!% z+4SqL;t@0KKtn$j1+D4aXPQP|1^r^(45NJ^OlhtZjO+TX3{zAas%gnigDF!v`n{Rm zV7@o6P4?@q%-_li-ew7?$k+uwHv@wKDEV$#_O#@&;*nrghS~$8~3f(F|z5Cd*FOIrI5J-RPtiu3znQrS^mRI#O>D z=Oz%=r#f-zr|#LYW91(c7XMMel9oae-Yo>)CYis$PG)c)@b|z_sa|I!YdPx-3Z;c3 z)OUqu`05k*g|OHU9;4`7@UZlLsZeEVE-B2@xZiJt=GH{cK!%eNlxa8`^gsb-}&k3>F&z~*UJVL znV(h^yqhuh>j28@P0W|D3d|4V;|JiMlw)*x_05GZ_T6``|5 zE#T8oNFd|%H&}-Y>p#tG-}ix+YofkvU>%7%H*scvOq!pUV4q7qw*kZDj=T<|hVglc z@F~NfDbUUBXT4a(&}Djh}PQdtcu z0T^JS7MLz)J)K3W&n+AP6%F!=S4KX0si$Z^Xm?(PM(bRZh#&dr&VyfiIjr@vfJL=G z9*18Qz$-5cR4)}G`@oWB(>aG^cwT%pBL%CUr-FN?bF4$n3f>F7GTW zOHW+Z4XVpIy78~jCX)*NLKsVdmKmlgxFo1@rjy{xw3OLuV}wx?XqsiSlF)j9^`AEt z4le;L85ZqlMdIA_kzKo1FBe>w4XkU0a7W_sy%6{hIpm8hFfc4$F1U=4rOxXhjnw~n zDc}mFB6CB1EG0MFmrd$_r`jhM`~$?iQDe**N$qRaQJNY>5+DZPGO;edS6}9s=`WoO z~s5>t59Dwj$c1}nHO`K4XT%M zP17_C>I6VDR{w8$UWYlO04+zwF6C`yNkD3rX2z-7UgnEs;WBT-SsyM_pi2a%nR7OI zWb%z+mKq{n3V1U^lzK~MifbZa|NbMp_We;om~KE}mj$dlg&2$D@P9$zjixcZj=2W0 z(!mKB2z|GdPzNQ zcAOUKg9B`Z+-=vP(lkZQaA~lf$y5f5sSC!?sG0UMkdS4B>Ge9udeH18EWri)>oDX$ z^oav6-7I)nz&a8H-^&?33IV?WhD(8F&~t-;cL^|>Y$fDnl-BUGZ5O?)B2Z004D!kP zTX6aSWPmyYS2m=YvRNT~=3t_lRvj@mu^2nt5ZjytjmX9s;o}sy(3F;zZsIe9edef> zEs=X08+2ULH!|)*i9K58p@J#?x5g0~@G`792#4`wF8Cdm`>T8;Ig8Hmt)>$lz^s`#= z3drh=Daq>hR#}9b*dlJgGPa8@YBq=ESAo(nI&26pBtE{@2A+vHXnxBq3n}5Q_E~AG zqWi8G$N*PCxEJjWUDsM)>d|t-IQ5#jG{E}2Ep42VzXfKUupR$~4^2;Ba@6c4fpuH2 z_j6$EH(s`1b-C;$a3vftCw?E#ZuOQuBR!!b}!3*s5TpY4bJL zc3BIo3CgrcIx0f^8~X%a9iKxv=}B-f3*c@IsEh*T5ePPlfDhxoW*499F|=jPplCTr zFc>;Z@`uSrnxzVl>4LVQ^HNUH+siMc^;xz$UMUQX@{ShqlF@jow*>p;|Fw7TuU(3= zE(xq#JDqLJw(p0)?w1UKmkXrJX14W!%L~JWIgAWkwh*9x9r}obYF@eqRyYDhgEUVn z3|-a-nnDMKQJ>38I>1)Z!8?+pxPqSmO9E*dSS$e?GNq~z_7Lpq1eiO4#H%B*DtM@s z;4>|O1xo1)KvJPFW2}Kd>JOp0g;B6YjP0aXmN5}!1WEaEsqHX8YpD!T0ZRz$R2YS? z|Ky>KN6R(_mJsaLAovLe_FH;Hs~D;V=$4ly)YG$_y~i*)(=R!QB@2v|zL&r>jToB%F%}bsb5Vk$!be~ztzLrHmMu)!7CdIjSw0~WM4Y3I2#<6) z{-o>UMd25rqT}Vdkebr3A$0T4&%+`C#{tI=Cr{$e_+gZKYd{jF2&C6p5?HWZ!12Jm z8iYTBq%;aq8inIdz!E;5?Ya2aD)6FAPRy{VYlKF2X|R_{0E*e7SprgEQs1S>Vg@Pb zFJ?;0J|9c&h3Rh*z!K{(84up}2Zs(Vy)0lIX@}QwTYODsf-e_PFDoqeSq$>M8*45N ztcu{c!HV&{Wq~~&oj^K#3Frb+-2jPf1CeW{fnm0{hL5e4aDPJiTHXtxMYz^$CYz-d z+B75?hcBHobOgs6_(}Xo^!MI7DvufHZ#s^CInQ|Mj95ir$w1z z%4E6y(6Lx@+eh~8d*EdO>$Yz1_W}0K!Nz8P7#oz%Un*2yo={g8n`Vfd!732=PB+B& zR2&RBbRt7=#NdKXs0J1hhYt(36wsu+mU;qz&@AEpu!OGBK32SN(yO~KJoZyNWtfMO z1^jIMAU21mAmRp)1b|4uvznibiIhnJwhdw1uq+46CU8}NQXO$+3s4$|<8Q)4%`!f` z%CMS_tYx!^rZr)7KxA2D;W5LGFlv%{SS%La)iLf1h3R9t1u+0voFPfvPksFG%=ce5 zu;e^oFI>p9RpB7N98eho{Bl`r-Rq3dLku8*Tf7+Wt|zG5G$_}G5CH^_hE|BQAS?$lJTzmDyO%B87nQR9109y>@OmOai3wD}QDzKP2G|T3MB;GXs zc%g)QJ2rhq$U?_h2Pm z$rgh24X2*~%u?AH*cg~wfgn*2U!JTNdK@2Et6?s7Fis{W0_ZJ;%9f1+oM%A`p z*$!OJWOnC}>%;`OVDQ)v^r*uw3~X zP>5tM;EjM)M}XQ0Sa}-DVgkRtSi-Z3V+eUwfX-ZeVxrXZk`T~;%d#$1`;MFNS6b|77t5pQ4@XMTb0+(3|S_dw( z{l=&#u4@o9*-IbjRFU;%=~?ri0W9rlNxtOP1C@?<+uhe~EzBjZW31ad;cEove*&=0 zIz$wHo6sBxG@bnoaL!*cb1c%b8KQ_iud;gh4&ufo(YU#gcF zl5hch?yq4j9|M|;h?;F!r4pQa86plLIHd>lWeGqEP>fIWEIwe=x2_;b;)v#RV+;B z8KTr)7no(g<)a5@9yXz|4p_If!yktb?|VsomC@;CXs&FBRlRRRCLF|KDHv@Ce6Qcc z+p7WGXa$HCfv^D)Q5bAX=HhV&A`ZYvYmwz3MY9Xxm%++gVO6Ik;{@j)K@zl4+5JlJ z%3%OQs>MZyhIFkmxvTlU61d1*uy_|@Bl)%E1@PxtF`!2Q2wS zFb6UBRqzWBBbuK_TpEKjW+Uk=fpHF(Kx})k7@YvFN&o_gR=Q}tu!7_?9iIxk$!WOT zx5BBF5xsC0(aBj@-562LhrMSS_q^^d+&8gjaHC%#3p5>f`302dH~Z)Nd$k5O0q z(LVhotc7#Hrd_D+dlQ&51xws-kWH?x+M9RHkb4*MN__S_llzKWYvv2yymD?X52&~(i;d=zc zZ@+9))a*=9Y`ktKFBww%*=_)UuN15JFO}y|OV-eO;TWQ0r-6&hh}Jp?Wo^qs5DU0T zfKoL^d9(_9YYnBzVc0`ez@-%5hUNKyUzK4n5)9qvpN7>uhsssA!rt`lh@4?q+)nLN zmEe<_5F$ph{5XQMUqceKVD(lJEnkG^4a3>G4c6Ew>>z?@bP+s1i|$ir5guQH(_ye# z307#s3I&oNM3N-RxFtrTlA>RNJ34}HwG4K}UYvjHci{{5Z8&B5SQZx55c2jK-KVuK z)a4>R%N#T3UR~8$Pk+C0+JC|dGu|NO^avHdp(0_(O$a4 zZpGrx%UB#$9{;%UT3UxZ77ceR6XYBT)T-2`vu zFnG+sn``L3cnV9Wo*Li?1wk91r}wXK^wi3=dt+t2jQGp zhPxC)EOy~J73En-`9}AlP})uUU1Z$a4y=(81c{I6hAS}sW8a7J{=;Zl7M7z3kF+@+ zX~sC0Fm&hwk`p|}NPgB6ZLy?Yg|Wh8ec|tAy?5|u(H2LMV2jOhr3c*AJBjk6 zUx0Z2B&-v&5N9p|VF-*`;H6E7H_yPEo`$t)64vMhEKeX>UO@QVX#~fgg58~myL%Ls zYY)KPISyxZ7>Qql?G8hDE}Bn2f-qhJ8`*~OgZ~yt5-{F|uzRXQA*rHu{Bd;V9)mwJ zj@rZ&m?aQ*dI*nSKD90e?Q#m2_!ZHw*kJsVh0{(eLMlY^{gXG#%6vF9%#X>&4#M@Tad-w`a-7;kI^oJ!0|DI#Bh8r480# zzht5MGW8YhOj&Sjw-W4kfm_@VGoFnKWmzj{(D=e9!H=JWeP#}L@dA=&hm35%^TFsu zReU7Ahs1MX2MMTZXGIn)Uw}2%z}pSK=b$cuP8Ig$pPcfBdp!6jsxCSjre<@Kv;JN;ck6uE-VmC|h1LXh*TnnR) z1CQ!!vSZIi(pp6GukJze$k$=dt{^%y2eI0MohV^V;+%fC=csTI3UFJ%PDr7sZ<-*2 z5D|D3g4+(_sS%W3eHhg{Za``O4zThRI;WmPa_n)GNa)L~CxM6(@Ysg4>kxWtYiK@n z6v-o}V4Yb4UswZr0qhv?$!sUxPsL^`I?GU}>Xe}ESw1?Rhwj8AYOj7BhVQr;&c0o+ zt5q5UaBBsabnUcjhV%p(Z~~STxdGabe+A-i{u1ozlZckr5Y8>b?Zwhw zP)@Y;q2(74WOUkefGHG_zM(531|y)w5xSiKF@dt|p*QTq-|*!9G5`P|07*naR6m2- zjn~27w;jQ$6DXH#c$SBl49_G%IKPI~2cH8jwh%RX==ORj_XNr@;0O!0&0wX4W_evw zICE_zwuRXBVAqFXZQTv~wXcDH<7?n--2zs!VL3Kz$Ctp9no9zcz6zCp=opYNR-jV< zpB_vm5Zg?J%}`)A0KU+S@OUReQx?9>0<}3V*7vtzSenLZ9=Qyim1!>BpH=j?AjF@3 z;@au&%78`nL3=HF076{7E);&VGQOOxvyX6uz?D{vA1HGi_8F+HO2Hx>nxwzvFfg^m zB#2j+(E0Lxz*p~wIC~1cg*C9XE+Bev69FrxcdDygFb-h}`L|7&B9Kv$m~-$XL7XIr zf(V^3MnI3d4x*BWWO59nui68zUO|aF;N1{$#RZQoG@m|$_T$Gud78~^lsH3G5TF>~ z5lBc!Q3#Y;ADqB8Gy?n3b?{$#Ev$WqfNhg-JsWP>f#s%vB1=SqlE9=usfy_7g+g5s z=~2u2;YoW@v0DaOReub5f=63je7+gt#U4+qmBl5!`&*tfowbfp%tc!I7Hmsr4<*bc ztJ6u7KFu>RdN+Ogx;<-hfA3rqdt(v(4TRW{2KVgbzijKl2z`S>o)U?Q6%RWhetHPl zYB4y}MnaLFa8DBYJWD9s3+M;}1&#V>%JI|~+(^WH<$Xahk4ua~}#F@zR} zEjVntddY5}G@sayz!fK8L4uHTghC*)Z8RJQm49;t+g^77E1&u+#1EcCuwx2ae)0!U z-oF>&a*Q+o@7=KGPXd;Qawme_=^~{5cAiM)mUO9bCK6CqW z^g3aQKY|cb>wqNLBaL5|@~CJ-m(pK-p|T2rpQr{nQli4I7OARXUuiB13mlxl1OiKf zgmc)j56%OKg*mjp{unwhJO$C1htH_{H#=BG2e;%fZ_K_PY?GX6X4`YYh_TCddbAs7q-s z05kuvj=0RuC*KAUc0R8kSgE zLNGgrxHAja>7ZmWgrupWkd_mJCtO)P4QZQU2u>QT?8C0sG5P~<#pn(DA=(BvGS*+57$!6J;0W$uT6&C5TfeW!*4pb>IYvsyX^dnX81PR)$rp zz^YbYPtCyIawT|e7ZPg-yxW85QF5TdvE}=)Js&oCZCOc5V@s$|naUHnCarEICXbAY z()7H=u@-T>Zyq>7G1*xALHkyNLZTMU{XU{*C51b!x$?zCbeV?>bQl-!{=?U7`*6xw zyIoeCrT>au z-?kT{M{b0(V>?6?fiGQzSZX5aG!cZWuzMjGweENx?6M8Zw-MEA@M}BZRJTKnO~UrZ zAfghYPKcn{k)&@q9vsJq?W%SjDa5nx&@?clCx<5-f_`L~lLB7?5|tsd@Vm<{o($4iTo{s0 z54=mweN>1Jq_#pgKoZftu(^AKTAs%SdkoY+s^e6)aVtpN z5=3PP?zRKKuKlp%6~wIs%qzpOT_h#yo2Sr}-W*VnSz5x$kKKdz2j2&8)I;so8!&d; zx4|cK(@Kz#=89Xe2q+znD2ZS>32c{ag&M5V5McWdwISFv5=L!1jF^-m=ynmcL&UL# za;d6D>NT*^3!98n%9dkJpb`)a+y;!{{mlxFMx@uwo~;~E58A?FsE7SmZ--t8yi|m$pQFB=MK`{11>-Ciq*#+h@!(u;^<&s~ss{GwQ zvPF-*mNoIS_IZ>mHhkZfdLd#Qc0@fUHaPYBkcX9KJvITW+lCcJKuj#A{3vqY6IxNg zBF%Ifta}QK1{-2(TUPIvhl^U1X^6oa2lGb(y8>3O$tFPgGqf3kPCO+G1OypYEUEF5 zW*bheDhu2R=^pMOUR%Ps4}TJi_x?31PJr@uAN4DyQGMk>lnx(+Gh7E^3nKBsMF5sW zVC3df3l9yAkw7O#vVB;rB*k~yUICskggsk+4*e}xs-dn`>X@MYp+rGGM2QFqMm@r4 z$;>qFc4SiWKcith$^G1VNHeEFepafO)cIP+3YXMw`yMdnpt^q?!>_vnwF6hd8rr0K+c|Ywq~)Ac4@rV&WROq>n2xM* zx@gE6p)lwp>Qs@$0&x<6M@%vlPnm=?DP_1M@ZB=?fC0^=6$mnH9UH%IP2h1+E-tKV z^k(VqhzwNnlf) zaLSVoI)bI+fHJ$oEp$(Jd0Nw`?!A)>N}(!>3gQiozE4&=V*UFzTfjYJ82y>7)qf-X*BgOkQ5a0*~3kdK0^SwmSpI`YV7P7+CL1nP{Mp?*mq5#$R$>D-~XE5sP?F zbPPVF|2&jnkUD`(LC1lRnN$f*r3{O%c#CAI1&ijQx)lDJ;AjD*7HDY=JD>v|1EjrZ zTM}3_JOQ|jT4e~ZLtwTqd(?Xun&7Q6tSx&{+P4R8g(i3sh)x%4PaH+#$!EdN%p-2J z5fN*`g75lZ^$NVP8f?#%CTKvPXWL-IHQB|`zHk96^RwtK&SOZdVyqsbzIzh&>kq-- ze;D@2cEoNKmgq`mWsC+iNF%AK9(6}FWiwC~97WU_y9q&~4lA&wHAC4WeRkOGA!xP{ zcE}`F>_=rG$|yzI#mAi~Jc_cB6)KS?oe6DQ7;b*yo_|up^y!`f-4401*E&m_c5Lq! zc4WS{PY8>qS?P}P1#M)8M%~VmO*Eyfsg{>E5H{%V0oKEFca3@CL`(;G!Haf>nqjUT;*jf`G ztHBu=1{?Chsy^&;87P zTi9SgXj`YVQZ_39(g0e&-5{^UbR*aCHT+`uEWEG>n+{|WE3qwot2D^d0hgDTK)>rk8C z0;eu-_=<>1JLfOLrYw`*vfO}}TR}{Xgk2hlRRFL`9^9cS?9m#mS{Yuo0@NyqY9)B( z3T)2gni0J?gx&0-Ik$qd$4`Nucp9~29`#{h;>u~%zx`TxTPa~6w9pwIrsaERhloVmXV7_q0w#$;BT!oA4m36}nKh zp2|u?DJz(4r4~vt#d8rznn(sZ@`6PS@ipwWx#+b_h`$?{5%w|IpzN^VQEikl_A?D?$d*HEvmI$Y0Fz{n22s>x6j7k z4aPrXhCTD|LZnNrhb-eW8LK}8ZWJQZ*L_DckDo|R!wx&jHXwU|!l5+q)YU@SkGe8t ztDMYw$WLP4GQgjOC`B?1F^?AAuw*9z9e6vUqOlDT3G_}hu=3<0R=VSuyy`X#@0x({ zsJDs1^L#`UilYS4Y7=&&1GEEac6P{5qOwn#%D3AcBvfB?UAUDJD#Jsv1mjn0K$%XY zEgSdjYFWDHQt#*`Z3zrvf^MgQ=G==|{QD;%PCbUoq=T6sJc26K3ll0Y2?b2o16}w0 zLL1@5Cc=vygtaNG4bLE!-KbiNseAFNh4v`iy9!vIi^TKrVShW03bHbErk5M7nz=Ft z>pQ6%WrZ5lDuFa6vJ3&w67~*u`^DsEz!TMnH7K;10^Rh?j8W>ya)JK`Al%A>GLC0NxGSj7V>G$>(%d5#PTB5=_? z)x+YK&SEv$jPV<8#pLdt;2t0x8xEa3&d}?2Wxo~ms`Hf=tPW+L5rQa2FOHNICZnJ& z#WY1$n?iD_EPoTo2nhiwqcxYQyDnch7cxe#amc?%A{;d;3B3SuezshsRczbuYoM7$f*HBe;otru2lI1!&}2y{8)H81y&&4ZtCvTz|um#5SB?_Q9I1) zqY!7FleZirW0`7jvPIdq0Aet|if+%x;-jmWJ2#H4H{XDn*X;nS56h7%3!cO87fE12w;v{;6pa}IgSJvomAOD7RTv( zs565Q9IHB~>;)6(EwACky&uES+G$MRbR9-2BZ!v?P*ewv|mJJZ!BCh5ZrD1X-VHYBBsS zyZwCdX8?Q4M&+FK07)N7vtupZ&5Y0ddms}s;Cq6zcw2Z5Ufh!F9VA5eR0EX8Vai%& z7)_Vyp#vCScnUcCjO>j|SOQy$uS5Z>LgA>4ZnuKd&#a(fU5#DW?!m-N6>M}IY^Vl{ z7={)>qcxtWY!ikMAwv@Q(#ntpXabTf>grWiR3DcNv$Exw0IFJv$v5&#fVUZ(GLVm|V ztPSlz%p6&d)LxhVO)^e~VaJ2#`$(!DK7#Fd8Y(MPYg6djU>ZcF4pgx|W3__xF_>&X zbW)LCi}=(ym4XlVvLolCKNCW{WkY?HZqUsB)~$ZCkv7{fR5HAY&*GiIi*Q5Az#=3u zg+t{)OHCu)>3qX#x;K>LQt{a*z|K4`J4;os5v7bmc8O9=kWO|J!#MwJ5AEUCV&_#e z7~4X|s}D{^W#3a8salZ(7&diiN;BM%X+Jq1B6L-qP!QOa1tQ0t8B4D|WCym@_sDuxRZ8$0_X^hDAlkZLq*PoxigZ{f4}vEVqIfYw_e zU@7V+%Yh2PIjHiTpphsEo>O0kIDJfZOv>Y);b$XZ7cGZFF#RAEG8 z{z8UC3Q1IIX;ZctB?xJpz7ry%FxLywy|{$AuYDQ^t{TNK8wT2>=~U~qk_5DuLhhSA zvlsKDyAhKBNLQ~R_S9}WO?lg%Ba;%}@e!7M+|9P*1yqV`lrfhn)Kd_pAW$VBGgB)H zd9%Wz2uV-sq;KT-Iy-VUd{_Y2z7%5>KFiQ@ie4`Tu0hW+d^e|1_#*5efK39GGD5oA zX$c?+EZvT(1hhH~794~SvrmGbI;xU+X{x5H<`MAHY-}k3E}kqQ*?bGO9iGDYlq+Wq zNsLkLkX|aoDuq*WzepodhF3~6JS+8oB7v|&EJkZ)IS|5@#c>+#l8wEjyQGoJ6q8We zPdbp;X=xQPO-EB-YJ1FjO2HX7FTiczCXm?1H%~dE3n!$JfeW5?m$6<8VPK# z1ZU<7T%6b;mpf9TJ*|P#co}IhIh5hTNm*;zt>OdLcFcnkiM(S$fu<M?SJkD-E8$JnvS7=}jGR4f2O}72@pI_`a)nLnXlG%_CT#qIEZ1@bS z0j(PCqgb>CPPrVats|x!QikMopVpaI{yM3DtC}}$-koviBXiG5nDKa zz6NYPg6)S#FtW*o|yPTnFz(DIDeKy6r z_?g~wI2m^o;nK0&~udY>wNNTW3!;FC4QG<~Oi&2HqDwg!{+(CXS)Yg-5@nrC)cc+W0Ai`+>_ZS2PNp?B zV+W)SO}+5~OOb^O7ivg$ya~JZGE^ogRH!SP)(DlDp@UAKQf-=9M3oGdYDCKF!qCBT z!@^=yAdsytOinsGSylX|(J~dn)jr9Zo&;7}MMy0RnrM!b7*S&$OZVN2?K8vJ zJT?NXw3U7`!v-0$o(*sEO3aPzK|~<3s5OQbIB{URj-2xG92be@Vv%|H8#aY!?NM~) z;&1Az9K==Y>DXPLEog@mADZ{4q!UV~whk^NHayUYtKxL8BapZ_&0+x&O^JT;{ zw`1oH7sH!8ICLUp)~HG#s_v#hl}*BAJ^!lDk{S)$9SaL<3@be$H4bSi0+vlTEFiGz zt1oRC*1(bzMluYl)?xC&BqLJ;Vv-B&N*wbBd4gIVJv!H0EDU1`Dp8>+|dz_AWl61TsV`i+?Of?=?5raMKPDaI&*Odn7J7{_W2kYQzwGVOpBDe zz5rxqr9z=p9(pxAwa^8%*Q3+3FyCNUArVhbZ0cc=kLFP;O`2(CD<#WaQJ|twC=F5q zmTW1eb+*(+6Roab?!J4mXL}u!TSs88cGM6mh3RzZaoSayi4@cOurhW9Vru@Qbt)Vi zL!O5UBn6bp|PB9=b>20lmw-hPr4 zL_YPZg_%6`g$?N9;D9h#0FPGfhIe}z;3AFm*029L?)r<5qfr8?2X|m}&n}cI4s4$& zow{F?5!yTb6*zNqD)bnKLzi@RXW{(CAvk+qk8Qh37#{N^TUlgi$`L8;<)mGh zlw<0UPx?jhs;vht08;T zQwHM#-L(}ge)V(Mxz)$ywkebw)UuQIkELU9v`OkoW77w)I(h)2T7fHi@OwSrJ+ zA$(;Qxv?r&2E4v?NBh}oPpt5%>syn9O zPmD^j+B^C8a4w#b)5qDhsWlOW!Z60g9>?PR5crPQWAiQtqvLfrl$Ogi7SbwPmUgFO z`MS`Zb`QkTthCYVIk>pSu+$;EDQkgrm18rw4wK7sr{;Frtf#JC8UAEuOaGuGM1f2J zmZP<{jOO2e4tu73jBnopzopiiNaP>~WtmheVzOJp+P)L<&_0BV4aBF9p?l^6oKB3P zi3vQn_aNSX{SRk>CkI78po%AA{p-x<`-r8W)YB6zFQh!^rY1i9T4uMu7+qijn+LYS z==WW&)++8-s(CKKaD8F?H76d%Pk!!hu*DXVZWq0FTg?yh7)_dU*u5E>UVRXw{v7O! z=M`faQ^Lxyv>!M5jV7?EsGN@b>yEVC-eB;MMOC@*{<75S+T&cmY4kL&xteludbYWGs_i$CCq%pG- zyAR-f*StNg2IRU}w;wB@6%k>wl{#|9NlIUO$#7^k6-egFwH5Vi)W|PgEH&{RODT&;M~P3#QvKxv)xB+Bmwi40jkzvSFDx&mzGIn2-AJ!^mpu_ zC4m)Vu}7=u(fifiD?CeuLb_Q20ZST}h2udsLpmfPEmc}gnZhH@1_F(hRm?x|864bP z#?F}?vg||dIb0vs&=B1533yw!%M}X4UWC@8N6|ff0pa2rtcb&PeN;w<@$9ypc;Bmj zSn9umAnF6uhTzIDH$ZRogRGy#Oi7cnHUoQ_-FYl}Q~<9mo_Irm4-A93kT>=zqu~M| zbA~NGpJ}%ASP0<2g=6@S_r4$HV;2RO{77peiU2L@3cA~-ERdjk=SVUJj|}d zSPZD_?Z^-+8OyRzq81vtQjRW~r&qr`FlxC+Y4S>7sawAi6VmOZf~6(Q-Tx^Zm>$B+ zju~l7kjY8&jbdmBV(S(RU;Qe0^$D~u&LMd6INHb0AYN+7UVqzmVO1)4e(QF;@9G}` zr~4ufD81yj8#YrN^DL!+(&wb_4zmT)859c5bF7%_5q9K-=pjZG7BgIJ1ct0Am<2<1 z0ycWD@iNmUF)@{WE*E&^`RDO-pZ}lmR|!~ah`TMs)VfSXYI%1r0jrk)Z@n7z-6gQq z1-X8MTAN+S@IW8g?FMMAM3`NvLF~H=TPN$N4-;cWlBpyJWsf-dSvhOTXJr3;T7Q%! z7=dQX!R!jha^xVQ0<{c<44!SvmH*^TMrH9_@up%gB@a|jy2=XWf3oXA&LN?B;Ubp) z_Om#+ZxeQI+a}Fd*LLC6hk!lP@OSK#y2@@bSiKOz(hAm2p95=jugwcJkX!K8|;P>0_|h2v`m9P6J8UMNAq?mUuYa80dHjtm~&y zf6W#-WXxJ^#49VXyId}+NF4^tOKqGwZejGwH)CS^6v|@(oDwZmOTbVQ$&#_8N1C#h zb_^sAl(Q8_0_~2C*%e@!YK3Hw%DSb1=eh8y_$%G(bPz;#La6@;W>iJU?v#-N(x#=o z7ti7J!;fI;=%aY;8?ME+{nKEz8tl@L>R~6~h!R$oW0WEvoYsSy@>aI_P?XLv@C%o+AVp19BS#6g=x7$ zk3eWqwicoEh8+kt+3=@EQ5vm-ce+T<&ddJwwPpuj|I_0L<1rlmw(BtSy8Yl|v}%kC zKaLU5s(P94lkT$wQ<{LJ*<6w^$ygUw30RhFw3BP23Caajf4L)RB2Js>l+MzJTZKYe z{Eeeb>z^(!;QZOgv8T6)j-xY61>{kYs+lnGQE#2s=+c@Rx22=|mP5)8Ag^{e8 zYkV+#mfi7u@;@N>yYjQ%2OeFn*r-%f_@MkB8?uV@pMB6h#-P@#|+pMX_i>tZcPkV;A|NK3pnEWRUG^B33L`CY^v8W+X@gk zbsWCoY7Fg|mXptvu1oo!P5}`UkU>e=9RWgF11?&`Sjz+~>R6?AWVIMCg~KuxfvHeT z^(E=R6R?y~Nr#SVo(^xpKK%?99()96o;!)>SsQPA_Bzb40@#Lsn@=fNTABq z2WeVobP`KnKL=|Ku&7%ij^I$|1@+XIODNTcVGj@C>DmZ>YyS@-_Uq>Qj(zNvo>x6y zH}Hh#q)-t0eFPu_(IBlQACni>N7$W5qhI@nl@fm`k6L|}K|ga1+Mvmn#wV@=*MRq$ z@p=E!IsEeHe-EYA1z61%M5752bmVB129=%`4&n&@UHjoo(QWb+=wx>R{Yeddw59>o zbe9-j{PHt6JKw|7;wq*pHH>Z9jLEAGp}Kz>?v6>I=F3t@IV47;+XavUqCzoACl9@z zi*w{-^$2*X(T+kc)e0*#u_J5Hs&ka;k0tWBh|-qMAv*pX_={(7{@JGy1tEGC!wDzC zo30we)ZrPFHqRgo6IgVUC^e^}mW`z5zS0Qh9y$#yC31OjTBt;py6Ut_P7Q8t2=2%* zPSi&6fA9Z6L zV0mx465ggYc~a$Fzf!M=K0+3JX)%!{f#Y9%8jA}Yi>qyHa?2RCT#QbPBk>)C6E##0 z&S3bO{U{9&OMOEbmt1^9Fhp?~y|#su%OM&O`CRF}c}TpwHiqhD)G8%(+by|!RTjZM z_dL2!J_UaEoSdvCyv;4l%Z#?k1Wr2%?s~;IHebCB<;~LwyJ{_XwSbATL_~>hQeMK+ z-<<+mV{oH1gi-OErmu(Vuxmpok5AzE$OwLI=l3C`b+`2K?W2`~0Y1P*AE>u9@VX4yZ>-f%SjULnM%vbEi_mXSWK)DO5p!o2S>Jy%z_5c<%qceWb$@P9t? z$GHC3b4Z%YKywXfP$;CVFBQOPwnj=QhpUvvU^_(!8P&c-Cil%b`hZ zxpq5BTPG2AiD3y?RM1vE`!oPc%NVVE`53&0x`BWo&y2QNsX)|+;EasG-!zUhqR|w%={Cx7fS-Q!PjLOQCn1_m@Wv|8qPwUnU{RZiUNDS+)8z@gx9&q} zys12-jLnR7ITMCxiQ~D?KZA>l9bh5GBs|osWz;v1D|1y1u*f#52#H*bq&zeXwsQ*D zyII~Vhr1)V*kM?U7$QNsjKQ};)DXg7y9jaaEW#IGggv*Q+G%KcY{|yD03>jMfECB+ za^R>h@EwOHG4txZ@HUSl3dmcdY*hwWWr5IoUc$lZeFQ8uJ4i9tc3s$1_NmrkjgG*Y z7{!a5w&K0x-+|bt5&S-lY=)Ko%8EX@11|P;ER=U1_fmRcu*#Jmq1zmNAdIFZbqo@L8M{xLW zJp^xTMLP0ou18N%6N8Z=wh%8wc=q0>aDF9#y%=LcIH=aj7@Hbb>p-MmT4ry0{WBT^ zq#kz92KOB#!*w(_4I_jNmsOx!Q_szeyKUlZ$HPQ{4nC8VhR* z8!wa+e8+)J*nZPNlr~Qw4%KSy@`nJHvKFoUxBQi3@Y-rJh(x_ym((i(wHlnUF|g55 zoY=Y#?;XDru~94BSf->GlSu;oYCIL;M(1N*5;C<}UpSQCU5L;U;u?0>F|mgS$=`ut zQdg%hCv?fzY~Y#oo1uB&-`I+%MP0n-vCrcA(?=m1s}K|liMfI0c&Ccd~_5~ zO&!308-2a%#WILsLoZ4*bzg*84@T4dR?n(#U@g9k^O=9{vXdmQVQ+Y>yAz)GMIprQ z0IQqwr;Nl_&YZ7BI)M^!sO^mABl*nOM zRlda`W zW`y3@7?QDJJUz7!zdm$}4AG{fk)OR$#4$&``oqme{~i!=GI-E)YW=O}V zz!P=5-a*3Jq_0aozaHGhc%NMzhLvjUsK;Zx>*>$q=Ht&ntSusG%mW>|+e8FLmvlP4 zLg9r9yKNDo`rX%|G~5Maw4$A!F;oDg*I1E*-fR!ge&!LZ&d2bZF{-wW`cMsHlCjd! zt#segJMg3jD1}H$_l;%;7cb6B$9{Nh9GiB|NPB@+?xO{EH5esM)3Zr~AM(K4-v8g- zmq6QblxKd`-FJKMzW45Znw37j*B zAvr^m2{TMK2p%$F0wft=hBMe>YcaOK3tohb7YRwWBwMniw?DnRZ{0QetGfGE*R8(y zO0vO|$1!^E-sMVsHe>Tn-o;!6OqF;lB?3lAJzm^3BS4RKJxMwb@Qr z^xKkBo++v^5IW0o@TU_Ivwr7{kj59L$|J0h1aTLGdvDxqt@Xb zZu#jByyM{0;Dtqa#W?{iPPx)W0B3MCB7t*?*D&(Fw<0r8rtnnX96|lbvpJe{t7)Tg zq=tRp{V^8i8%QkGFk&Y#oFB&6SWZ?h4Sd{vLvVY8BSj&-N@B8NxrXD%r-c49Fq*@% z4eN#7zA--ow^kI)CJ(jc%O^hwsS}c;-XM+~J&t0jgr@D{SSpRTY?{FOYp+6Td_+3c z2)#-&7X6STVXHx+@OccDEtyG%B6J*Ep;KquNO((oRlaC@WP=(C>08*SsqTLExdKZB-Xv_?MO@vgHhC2 zkWpDU9nvn*Ld#8J?t%TtlpQe2H6c7765y1+DW8X(%ZZY|59BuC%jwGlehjCi!^B{c zI1ysdjpNFfksW1Q$BMYb$>!gz4cfP{t2uX4&v<_V@ZXQfWK9Hi0L&yJ1Ce5o#St)u zpeOMq5tsH_xO3)FT>jEQcyp)VouV_pMR?@t&}@nFxuS%w@5xX_4MQKG)I>Eu_D}|U z`bWq9t`MldP{6bQ^e9d(ddQYsq>~OtN%_v_;R#^LRW6FH_zOOWD-0rz>1cbYP{PUS z86gISMn^HReyzygz$#1NPn_*@Ec=Lt{ zod27@0(&BlM2$+|1#Bg~SxJ|x!@Uv%8%gwv5Rq+ zeX%5!P&f8HEJ76|l=r^aGbrEzqiI6)4?%24 zo)Cu)?nAXuK!tJ4CtG;ahDoe_&(%mS8y9w6VHgdIU6SatP-{7u-+2%N6^hECqE3{L zD+zBP1)j?yH9iJsVg%pIUW9LWn>t*W+A)Js-K)b1AQX|lSWyk0Au!`aps%#ce_9r2 zpV{_d`_IIiyzc4N`@r!Pa0G`8t*$68;E-{ANxBVOE8GKHc12*xMIg&%(g? z1SVInmDNva2TFNNNtg=r1lga0ov+*+P%Pt-13yJ;VF9HCuw=Dx$(l*5{?NZbYJ5~O zqufqPtGkfN4w{t&X1;#}2}Z6tlrkv^CzF9QHU#9eNQ{kQF*A%m^xlM{6lkUCP;Hx& z#uLhXhFONR)Sq2
  • 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 U|4#-^EdT%j07*qoM6N<$g3)X85C8xG literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_send_gift.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_send_gift.imageset/Contents.json new file mode 100644 index 00000000..6e1d814b --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_send_gift.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_unfollow.imageset/4@3x.png b/YuMi/Assets.xcassets/1.0.31/room_user_card_unfollow.imageset/4@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf08121e573b877532b0f5eaa9e2a38901b8e23 GIT binary patch literal 6012 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_unlock.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.31/room_user_card_unlock.imageset/Contents.json new file mode 100644 index 00000000..8f10bc0c --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.31/room_user_card_unlock.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "1@3x (2).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.31/room_user_card_up_mic.imageset/5@3x.png b/YuMi/Assets.xcassets/1.0.31/room_user_card_up_mic.imageset/5@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f63d9c36de632bc5d477fbf61aaa99a141398342 GIT binary patch literal 6404 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 BnGOH| diff --git a/YuMi/Assets.xcassets/yna/UserCard/user_card_close_mic.imageset/user_card_close_mic.png b/YuMi/Assets.xcassets/yna/UserCard/user_card_close_mic.imageset/user_card_close_mic.png deleted file mode 100644 index 833b11102cb271e66f77cdda05c17931aed927bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1025 zcmV+c1pfPpP)2=^8fhl z|Muqp*pvUpV*m5q|LDN~;;{eHg#XED|McPi{PzFanE%y_|IBs&?$7_~#{b-%|K6ql z$7P+U;(`DG02g#pPE!C2@$2N>y_k1MAsF}B*UYG%absCeChEg<5&!@K_en%SR9M5! zncI@0Fc5|j6k+f@TkMhyR%rQC*yiCK% zh;J7a=sw4~iApq|?q^iw{UIPaDx#+YW1=!H+23pQVkcOWtT4RL@c7L2hk{N=o2F_RyV478YxoSQRY^bagyO=n>2v+>N4CC1%N zE}+L~N5UR5_)3gxez97f{n>=inq0?T6cQbz@%#2Qa-&Fb;|2se56ciBjqZpYLPX3M zV|!2xMVX_}jj?2D;~pWu_8@_nGA{)e{7%@~y)$lbx?LSy*_4T( zoZ|Ag=G99Wf1`Rfg#?4RZNj+x?G`B`JpS`le%qKJ=R7&XKX79@G9e_GMC!$334Y*`K6+YsAJ3p;hcy zasC?Lk>vGtzSv5R73vQ@>W^mX50C1Px782e>RSZrn;7cbEb1FU>RVOnn`!FXebpP1 vs#~Uto4Tso&Wao3YFqdJ!^?#iUw`}oe-O>jtmLH+00000NkvXXu0mjf>;n%P diff --git a/YuMi/Assets.xcassets/yna/UserCard/user_card_down_mic_listen.imageset/Contents.json b/YuMi/Assets.xcassets/yna/UserCard/user_card_down_mic_listen.imageset/Contents.json deleted file mode 100644 index 11fe6273..00000000 --- a/YuMi/Assets.xcassets/yna/UserCard/user_card_down_mic_listen.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "user_card_down_mic_listen.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/YuMi/Assets.xcassets/yna/UserCard/user_card_down_mic_listen.imageset/user_card_down_mic_listen.png b/YuMi/Assets.xcassets/yna/UserCard/user_card_down_mic_listen.imageset/user_card_down_mic_listen.png deleted file mode 100644 index ef7a2ef521c8dc5906a650cb35624b81707ae17a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 933 zcmV;W16urvP)D*8h6e|8LX(X3YO{)Bpef|ET2ux#|Dz`v3I&|LFMt%I^Px*#DK@|K#`o z)AIk#@Bgvq|Dodlnc)A4+W*Gw|G?}2+w}kX{{Ow||992@0IvCM0000PbW%=J01NBn z-PpaDcSt1n^Y6^4o^fMYPahc<3afChmjD0)t4TybR9M5T)aiDDFc1acVF&lE+8bLa zxUqQj{ok&HQ$1QTQI_v7WVmD|p%*rRKXV;(2nVvGjH3)1`a(2(~@8tVxfo2-d7 zu+f4&VCz|E#TxMS`mDIN(VD$h^ml>|CiPx>=)|kdGdf!QJ8xrjG=4sXE;@7R!4f@K z(w$+U2bMuMK6>Hb1DfcCd5btlPv(CGZRjP(eH022M*Cv|9h)ivbmHP$JoqkR@B)&i zx^lUw$@!AgswE?^PN9&Ze48doy3HdYg(omZvMnpHifVb0;VvtxPZVIRwAakO`oSxn zT&qpkYc3rJjDw7qq9&Cg4^VQ5Heej(=4DXG7s6yDe7E9PVk0tc3#}f7|0Z76| zL<&iG5E-ozJ~hIZO?b3~{>t^o+Acyr7TS7Ftom|75qfJBp<#`*MbZZ$eH3xt(x@du z*|#KgmGYHwZi>=t;z{Y|ab_qg!n}tMobZttJ+#Bu3iRTGUd`akBYM3>FW_*C0BvHR zZ5Ff(BrFTmN5t@c;g+|0|FEZ&~~Q7W1iP17{IH;POukeho_wo;|rOXpF>75+PB7s{Id zX>^H)#Al1KRS2|f7P~6QZ=F!mR`~SMF*}!kJ3>|UiULpd&g+{~RncX>G~I&PCig+W zN>6do5_Oeo?!dqwZcUZ^Q@=htQdD#0fpyNj_9&b7^VO-3?zrdvyL0KjoYV{3Z&ohK z4-eZcUU+hUTgk(vjn8+CSxyy(ijFTFO@ z@%7p5GhY6iYSH%KulwB}o{AFlnQK4TZP~Th{=ny#Ds1|;@n!pC-klepp4D?wqG`K{ zac0M?33c32a(qiF+r3pk?2q^Ev506i*N!yao$YviQn{+P zI)lHsuSbEhq51<>7j6!_slQVEB)Bs(F0EaeUVD5_PVk1Lf3o@IQHEdgPVav%xMosJ z=O&ggn(ozG^;Dk9w}XI_C3d*$LdUdn=RO4f=jR`pjmgw>5EMMkV)>=Zv*i z)NaUZsTBCs@QOL7Znp7sQMN>dE_JZrqTH_xSVw{c4ljcPysteo=EE(q+z_ zY9aP-iK~}v50GaMlS=q+wfs7R_D=1F?1;6inJT9HFvgrI7h^S;9K|TZR1mEnLmVx(puJW+<>yGQ~10hyS^vrUi1{yi_d_LOzM3{F6Zbj zxLN7tmZX^w*3aYjo^@~7hHn1dvo4-i-hFQqw?(Yr235A`%^O?=qC+>PN=1L4*s2me sbJ9}1XzR&GEyC~qKm7Pm|9N?N)!83bGO*8P2PS9+Pgg&ebxsLQ04?vri~s-t diff --git a/YuMi/Assets.xcassets/yna/UserCard/user_card_no_lock_mic.imageset/user_card_no_lock_mic.png b/YuMi/Assets.xcassets/yna/UserCard/user_card_no_lock_mic.imageset/user_card_no_lock_mic.png deleted file mode 100644 index 4963360b6b7d0ae9eeac662a37f02aeb0e4c5ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 854 zcmV-c1F8IpP)fW|B<%; z!q)%U=Ks^;|9`6gdZ+)p(*LBx|F_TooW1{pt^e@#|FO&exzPW_2E^(B000rWVu7W@e2H>(UE}#hh zpaB(eH=g%@y5od|gg}SQ?+WJPPc!Y5Iz+DHS*A7z=9+1FjvLW*z&aQy&`(y;&RTv{EsEx+1x)je+bfNrVdwwg`ze zGcbZNWAk*3qR;reUnYhIMl-^e{w^@VqSf*)8@ zMbROX{uPHf-WAU`WOStpbfj^YxN=D$;Zy}`;C_B z*1ZhL@s*e1cd(2y&jo8Q5{_wgok#J%2g@a43D!yE-B7t5#Q|7L`chPIUgGv@v+~ZQ zC90w=0a#*So~U_#k6vH}@--vMxuWKF$&!wxV}f(#E{taqMPQ}kZD5$FYiJS-599o^J-JvXk zFMo%2|IL}P3WG2dMW40ACI}7%u}C4tL0$a+&#R%UH-ntPw}zZC@7@yyJg)46oc%af zz*YiB4ICw~wVDOi=2)P!h6Og(vB1te3-lIPV6dJA_GXR*y1b-F;480D68Kh&J_Dl$ zMge?OGK!@CBdQ&O4aU;o;d z|IK&*`0fAVu>aty|J|Se&wKyNZ~yMl|JIKG)QJD|-~Z>m|K+&<vrI977kcQJvl{iyHA=NA$Iq##C{+yNZqoXwahZUN2Q9*ZBv^@hA8RRDI5h@$m z#QFxPVIW=PvWHrFOUZma)YQwJ(H@|-ft}Ou2n~#~T^ne`$o$V}X!cb|7Y%hki_y`T z{&8Q>g85s+eYBwe-?Ryu`v^QQc(|aMuK`t1oC{A~98lE15vQP>_xxpl24$KC4nf!k z{7tY0VaO5|C=nO@$aN#13lS(5i;c+vy?8DMf)mf`kt2?iN)!-oTsR?d;=&CCC9Y)w z%0Xn@k-CeI11O8aGxHP~E2LK9<5_rgG*H&xfoo7S#%#112%A~$23pK)H_&90b^|BG zX?1q8z?}mbU0!m?`6fSb!+9vLS%rk3Jdtc*@?d;Os7!$b7p{3P<;n#}C=4?389XB7 zf`f#^g%HR1Fhb_HIdfZW7zTnU^bgvHu$$;&DQbPG-QfTKxkeWVHfRJD3q4PM64qLt zogLK{Ec?rgI7+y*c&S2-`j)?PslJo;2cnRl$Xg_fZ}pF&^9BPatmTLaxd^)YQGhlK zu~t4V@ZwHB)^@0?131`IDc@?iVAfK|J2==M1YR-gpW1EO^{%o$@(=j+kT}d7xhf(G z+ZKpOT{#kfI3W2d + +@class UserInfoModel; + +NS_ASSUME_NONNULL_BEGIN + +@interface MoliAvatar : UIView + +@property(nonatomic, strong) UserInfoModel *userInfo; + +@property(nonatomic, copy) void(^handleTapAvatar)(void); + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/CustomUI/MoliAvatar.m b/YuMi/CustomUI/MoliAvatar.m new file mode 100644 index 00000000..7d995c5c --- /dev/null +++ b/YuMi/CustomUI/MoliAvatar.m @@ -0,0 +1,153 @@ +// +// MoliAvatar.m +// YuMi +// +// Created by P on 2024/12/11. +// + +#import "MoliAvatar.h" + +#import "UserInfoModel.h" + +#import +#import + +#import "UIView+VAP.h" +#import "SpriteSheetImageManager.h" + +@interface MoliAvatar () + +@property (nonatomic,strong) NetImageView *avatarView; + +///序列帧 +@property (nonatomic, strong) SpriteSheetImageManager *sequenceFrameManager; +@property (nonatomic,strong) YYAnimatedImageView *sequenceFrameHeadWear; + +///SVGA +@property (nonatomic, strong) SVGAImageView *headWearSvgaImageView; + +@end + +@implementation MoliAvatar + +- (void)dealloc +{ + if (_headWearSvgaImageView) { + [_headWearSvgaImageView stopAnimation]; + } +} + +- (instancetype)init { + if (self = [super init]) { + [self addSubview:self.avatarView]; + [self.avatarView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self); + }]; + } + return self; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + + [self.avatarView setCornerRadius:self.frame.size.height / 2]; +} + +- (void)setUserInfo:(UserInfoModel *)userInfo { + _userInfo = userInfo; + + self.avatarView.imageUrl = userInfo.avatar; + + NSString *headerUrl = self.userInfo.headwearEffect.length > 0 ? self.userInfo.headwearEffect : self.userInfo.headwearPic; + if ([NSString isEmpty:headerUrl]) { + return; + } + + if ([userInfo isHeadWearSVGA]) { + [self setupAndPlaySVGA: headerUrl]; + } else { + [self setupAndPlayAnimate: headerUrl]; + } +} + +- (void)setupAndPlaySVGA:(NSString *)url { + [self addSubview:self.headWearSvgaImageView]; + [self.headWearSvgaImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.center.mas_equalTo(self.avatarView); + make.size.mas_equalTo(self.avatarView).multipliedBy(1.3); + }]; + + [self.headWearSvgaImageView setImageName:url]; +} + +- (void)setupAndPlayAnimate:(NSString *)url { + [self addSubview:self.sequenceFrameHeadWear]; + [self.sequenceFrameHeadWear mas_makeConstraints:^(MASConstraintMaker *make) { + make.center.mas_equalTo(self.avatarView); + make.size.mas_equalTo(self.avatarView).multipliedBy(1.3); + }]; + + @kWeakify(self); + [self.sequenceFrameManager loadSpriteSheetImageWithURL:[NSURL URLWithString:url] + completionBlock:^(YYSpriteSheetImage * _Nullable sprit) { + @kStrongify(self); + self.sequenceFrameHeadWear.image = sprit; + } failureBlock:^(NSError * _Nullable error) {}]; +} + +#pragma mark - +- (void)clickAvatarAction { + if (self.handleTapAvatar) { + self.handleTapAvatar(); + } +} + +#pragma mark - + + +#pragma mark - +-(NetImageView *)avatarView{ + if (!_avatarView){ + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserIcon; + _avatarView = [[NetImageView alloc]initWithConfig:config]; + _avatarView.layer.cornerRadius = kGetScaleWidth(41); + _avatarView.layer.masksToBounds = YES; + _avatarView.layer.borderWidth = 1; + _avatarView.userInteractionEnabled = YES; + _avatarView.layer.borderColor = [UIColor whiteColor].CGColor; + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickAvatarAction)]; + [_avatarView addGestureRecognizer:tap]; + } + return _avatarView; +} + +- (SVGAImageView *)headWearSvgaImageView { + if (!_headWearSvgaImageView) { + _headWearSvgaImageView = [[SVGAImageView alloc]init]; + _headWearSvgaImageView.backgroundColor = [UIColor clearColor]; + _headWearSvgaImageView.frame = self.bounds; + _headWearSvgaImageView.userInteractionEnabled = YES; + _headWearSvgaImageView.autoPlay = YES; + } + return _headWearSvgaImageView; +} + +- (YYAnimatedImageView *)sequenceFrameHeadWear { + if (!_sequenceFrameHeadWear) { + _sequenceFrameHeadWear = [[YYAnimatedImageView alloc] init]; + _sequenceFrameHeadWear.backgroundColor = [UIColor clearColor]; + _sequenceFrameHeadWear.contentMode = UIViewContentModeScaleAspectFit; + } + return _sequenceFrameHeadWear; +} + +- (SpriteSheetImageManager *)sequenceFrameManager { + if (!_sequenceFrameManager) { + _sequenceFrameManager = [[SpriteSheetImageManager alloc] init]; + } + return _sequenceFrameManager; +} + +@end diff --git a/YuMi/CustomUI/SexAgeLabel.h b/YuMi/CustomUI/SexAgeLabel.h new file mode 100644 index 00000000..7c674fa7 --- /dev/null +++ b/YuMi/CustomUI/SexAgeLabel.h @@ -0,0 +1,18 @@ +// +// SexAgeLabel.h +// YuMi +// +// Created by P on 2024/12/11. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface SexAgeLabel : UIView + +- (void)updateSex:(BOOL)isMale age:(NSInteger)age; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/CustomUI/SexAgeLabel.m b/YuMi/CustomUI/SexAgeLabel.m new file mode 100644 index 00000000..b0fa42de --- /dev/null +++ b/YuMi/CustomUI/SexAgeLabel.m @@ -0,0 +1,65 @@ +// +// SexAgeLabel.m +// YuMi +// +// Created by P on 2024/12/11. +// + +#import "SexAgeLabel.h" + +@interface SexAgeLabel () + +@property(nonatomic, strong) UIView *pillBackground; +@property(nonatomic, strong) UIImageView *sexImageView; +@property(nonatomic, strong) UILabel *ageLabel; + +@end + +@implementation SexAgeLabel + +- (instancetype)init { + if (self = [super init]) { + +// self.frame = CGRectMake(0, 0, 35, 16); + + [self setCornerRadius:8]; + [self addGradientBackgroundWithColors:@[[UIColor redColor], [UIColor blueColor]] startPoint:CGPointMake(0.5, 0) endPoint:CGPointMake(0.5, 1) cornerRadius:8]; + + [self addSubview:self.sexImageView]; + [self addSubview:self.ageLabel]; + [self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self); + make.leading.mas_equalTo(2); + make.width.height.mas_equalTo(8); + }]; + + [self.ageLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self); + make.leading.mas_equalTo(self.sexImageView.mas_trailing).offset(2); + make.trailing.mas_equalTo(-2); + }]; + } + return self; +} + +- (void)updateSex:(BOOL)isMale age:(NSInteger)age { + self.sexImageView.image = isMale ? kImage(@"session_user_sex_male") : kImage(@"session_user_sex_female"); + self.ageLabel.text = @(age).stringValue; +} + +- (UIImageView *)sexImageView { + if (!_sexImageView) { + _sexImageView = [[UIImageView alloc] init]; + _sexImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _sexImageView; +} + +- (UILabel *)ageLabel { + if (!_ageLabel) { + _ageLabel = [UILabel labelInitWithText:@"" font:kFontSemibold(12) textColor:[UIColor whiteColor]]; + } + return _ageLabel; +} + +@end diff --git a/YuMi/Modules/YMLogin/View/LoginFullInfoViewController.m b/YuMi/Modules/YMLogin/View/LoginFullInfoViewController.m index f3ae9645..711a064e 100644 --- a/YuMi/Modules/YMLogin/View/LoginFullInfoViewController.m +++ b/YuMi/Modules/YMLogin/View/LoginFullInfoViewController.m @@ -26,7 +26,9 @@ #import "PILoginManager.h" #import "ClientConfig.h" -@interface LoginFullInfoViewController () +#import "RegionListViewController.h" + +@interface LoginFullInfoViewController () ///背景 @property(nonatomic,strong) UIImageView *bgImageView; @@ -61,11 +63,16 @@ ///邀请码输入框 @property (nonatomic,strong) MSBaseTextField *codeTextField; +@property (nonatomic,strong) UIView *regionContainView; +@property(nonatomic, strong) UILabel *regionLabel; +@property(nonatomic, strong) NetImageView *regionFlagImageView; + ///第三方的用户信息 @property (nonatomic,strong) ThirdUserInfo *thirdInfo; ///目前选择的性别 @property (nonatomic,copy) NSString *sexString; + @end @implementation LoginFullInfoViewController @@ -107,6 +114,7 @@ [self.bgView addSubview:self.backView]; [self.view addSubview:self.codeContainView]; + [self.view addSubview:self.regionContainView]; [self.view addSubview:self.nextButton]; [self.view addSubview:self.block18Tips]; @@ -118,6 +126,16 @@ [self.sexStackView addArrangedSubview:self.femaleView]; [self.codeContainView addSubview:self.codeTextField]; + + UIStackView *regionStack = [[UIStackView alloc] initWithArrangedSubviews:@[ + self.regionFlagImageView, + self.regionLabel + ]]; + [self.regionContainView addSubview:regionStack]; + [regionStack mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(kGetScaleWidth(24)); + make.centerY.mas_equalTo(self.regionContainView); + }]; if ([self.presenter getThirdUserInfo] && [self.presenter getThirdUserInfo].userName.length > 0) { self.textField.text = [self.presenter getThirdUserInfo].userName; @@ -146,7 +164,6 @@ [self.remindLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.equalTo(self.bgView).inset(kGetScaleWidth(10)); make.top.mas_equalTo(kGetScaleWidth(48)); - }]; [self.sexStackView mas_makeConstraints:^(MASConstraintMaker *make) { @@ -196,12 +213,17 @@ make.top.bottom.mas_equalTo(self.codeContainView); make.trailing.mas_equalTo(self.codeContainView).offset(-kGetScaleWidth(18)); }]; + + [self.regionContainView mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.height.mas_equalTo(self.backView); + make.top.mas_equalTo(self.codeContainView.mas_bottom).offset(kGetScaleWidth(20)); + }]; [self.nextButton mas_makeConstraints:^(MASConstraintMaker *make) { make.width.mas_equalTo(kGetScaleWidth(303)); make.centerX.equalTo(self.bgView); make.height.mas_equalTo(kGetScaleWidth(48)); - make.top.mas_equalTo(self.codeContainView.mas_bottom).offset(kGetScaleWidth(48)); + make.top.mas_equalTo(self.regionContainView.mas_bottom).offset(kGetScaleWidth(38)); }]; [self.block18Tips mas_makeConstraints:^(MASConstraintMaker *make) { @@ -228,6 +250,20 @@ _inviteCode = inviteCode; self.codeTextField.text = _inviteCode; } + +- (void)didTapRegionButton { + // TODO: display list + RegionListViewController *vc = [[RegionListViewController alloc] initForHomeTags]; + +// vc.modalPresentationStyle = UIModalPresentationPageSheet; // 可结合 UIModalPresentationCustom +// vc.preferredContentSize = CGSizeMake(self.view.bounds.size.width, 100); // 设置高度为 300 + +// vc.modalPresentationStyle = UIModalPresentationCustom; +// vc.transitioningDelegate = self; // 设置自定义的过渡代理 +// [self.navigationController pushViewController:vc animated:YES]; + [self presentViewController:vc animated:YES completion:nil]; +} + ///更新用户信息 - (void)updateUserInfo { [XNDJTDDLoadingTool showOnlyView:self.view]; @@ -253,6 +289,27 @@ } } +#pragma mark - UIViewControllerTransitioningDelegate +// +//- (UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented +// presentingViewController:(UIViewController *)presenting +// sourceViewController:(UIViewController *)source { +// CustomPresentationController *customPresentationController = +// [[CustomPresentationController alloc] initWithPresentedViewController:presented +// presentingViewController:presenting]; +// customPresentationController.preferredHeight = 400; // 設置想要的高度 +// return customPresentationController; +//} +// +//- (CGSize)sizeForChildContentContainer:(id)container withParentContainerSize:(CGSize)parentSize { +// return CGSizeMake(parentSize.width, 300); // 设置高度为 300 +//} +// +//- (CGRect)frameOfPresentedViewInContainerView { +// CGRect containerBounds = self.presentingViewController.view.bounds; +// return CGRectMake(0, containerBounds.size.height - 300, containerBounds.size.width, 300); // 从底部呈现,高度为 300 +//} + #pragma mark - LoginFullInfoProtocol - (void)requestRandomNickSuccess:(NSString *)nick { self.textField.text = nick; @@ -494,4 +551,45 @@ } return _bgView; } + +- (UIView *)regionContainView { + if (!_regionContainView) { + _regionContainView = [[UIView alloc] init]; + _regionContainView.backgroundColor = UIColorFromRGB(0xF5F6FA); + [_regionContainView setCornerRadius:kGetScaleWidth(52)/2]; + + UIImageView *arrow = [[UIImageView alloc] initWithImage:kImage(@"room_setting_arrow")]; + arrow.contentMode = UIViewContentModeScaleAspectFit; + [_regionContainView addSubview:arrow]; + [arrow mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(_regionContainView); + make.trailing.mas_equalTo(-20); + make.width.height.mas_equalTo(20); + }]; + + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapRegionButton)]; + [_regionContainView addGestureRecognizer:tap]; + } + return _regionContainView; +} + +- (UILabel *)regionLabel { + if (!_regionLabel) { + _regionLabel = [UILabel labelInitWithText:YMLocalizedString(@"1.0.31_text_0") + font:kFontMedium(12) + textColor:UIColorFromRGB(0xb3b3c1)]; + _regionLabel.userInteractionEnabled = YES; + } + return _regionLabel; +} + +- (NetImageView *)regionFlagImageView { + if (!_regionFlagImageView) { + _regionFlagImageView = [[NetImageView alloc] init]; + _regionFlagImageView.contentMode = UIViewContentModeScaleAspectFit; + _regionFlagImageView.userInteractionEnabled = YES; + } + return _regionFlagImageView; +} + @end diff --git a/YuMi/Modules/YMLogin/View/RegionListViewController.h b/YuMi/Modules/YMLogin/View/RegionListViewController.h new file mode 100644 index 00000000..f268b217 --- /dev/null +++ b/YuMi/Modules/YMLogin/View/RegionListViewController.h @@ -0,0 +1,22 @@ +// +// RegionListViewController.h +// YuMi +// +// Created by P on 2024/12/13. +// + +#import "MvpViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RegionListViewController : MvpViewController + +@property(nonatomic, copy) void(^handleDismiss)(void); +@property(nonatomic, copy) void(^handleTapComfirm)(id obj); + +- (instancetype)initForRegionList; +- (instancetype)initForHomeTags; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMLogin/View/RegionListViewController.m b/YuMi/Modules/YMLogin/View/RegionListViewController.m new file mode 100644 index 00000000..469bfa59 --- /dev/null +++ b/YuMi/Modules/YMLogin/View/RegionListViewController.m @@ -0,0 +1,324 @@ +// +// RegionListViewController.m +// YuMi +// +// Created by P on 2024/12/13. +// + +#import "RegionListViewController.h" + +@interface RegionListCell : UICollectionViewCell +@property(nonatomic, strong) UIStackView *contentStack; +@property(nonatomic, strong) NetImageView *flagImageView; +@property(nonatomic, strong) UILabel *titleLabel; + ++ (void)registerTo:(UICollectionView *)collectionView; ++ (RegionListCell *)cellFor:(UICollectionView *)collectionView indexPath:(NSIndexPath *)indexPath; + +@end + +@implementation RegionListCell ++ (void)registerTo:(UICollectionView *)collectionView { + [collectionView registerClass:[self class] forCellWithReuseIdentifier:NSStringFromClass([self class])]; +} + ++ (RegionListCell *)cellFor:(UICollectionView *)collectionView + indexPath:(NSIndexPath *)indexPath { + RegionListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([self class]) + forIndexPath:indexPath]; + cell.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1]; + return cell; +} + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + [self.contentView addSubview:self.contentStack]; + [self.contentStack mas_makeConstraints:^(MASConstraintMaker *make) { + make.center.mas_equalTo(self.contentView); + make.height.mas_equalTo(18); + }]; + + [self.flagImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(24, 18)); + }]; +#if DEBUG + self.flagImageView.imageUrl = @"https://cdn3.iconfinder.com/data/icons/142-mini-country-flags-16x16px/32/flag-usa2x.png"; + self.titleLabel.text = @"Make UAS great again!"; +#endif + } + return self; +} + +- (void)prepareForReuse { + [super prepareForReuse]; + self.flagImageView.image = nil; +} + +#pragma mark - +- (UIStackView *)contentStack { + if (!_contentStack) { + _contentStack = [[UIStackView alloc] initWithArrangedSubviews:@[ + self.flagImageView, + self.titleLabel + ]]; + _contentStack.axis = UILayoutConstraintAxisHorizontal; + _contentStack.distribution = UIStackViewDistributionEqualCentering; + _contentStack.alignment = UIStackViewAlignmentCenter; + } + return _contentStack; +} + +- (NetImageView *)flagImageView { + if (!_flagImageView) { + _flagImageView = [[NetImageView alloc] init]; + _flagImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _flagImageView; +} + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [UILabel labelInitWithText:@"" font:kFontMedium(13) textColor:UIColorFromRGB(0x313131)]; + } + return _titleLabel; +} + +@end + + +@interface RegionListViewController () + +@property(nonatomic, assign) NSInteger type; +@property(nonatomic, assign) CGFloat displayHeight; +@property(nonatomic, strong) UILabel *titleLabel; +@property(nonatomic, strong) UISearchBar *searchBar; +@property(nonatomic, strong) UICollectionView *collectionView; +@property(nonatomic, strong) UIButton *comfirmButton; +@property(nonatomic, strong) UIView *bgView; +@end + +@implementation RegionListViewController + +- (instancetype)initForRegionList { + if (self = [super init]) { + self.type = 1; + self.displayHeight = KScreenHeight; + } + return self; +} +- (instancetype)initForHomeTags{ + if (self = [super init]) { + self.type = 2; +// self.modalPresentationStyle = UIModalPresentationFullScreen; + self.displayHeight = KScreenHeight/2; + + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.title = YMLocalizedString(@"1.0.31_text_1"); + switch (self.type) { + case 1: + [self setupUIForFullDisplay]; + break; + case 2: + [self setupUIForHalfScreen]; + break; + + default: + break; + } +} + +- (void)setupUIForFullDisplay { + self.view.backgroundColor = [UIColor clearColor]; + + self.comfirmButton.frame = CGRectMake(0, 0, 48, 44); + UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.comfirmButton]; + self.navigationItem.rightBarButtonItem = rightBarButtonItem; + + [self.view addSubview:self.searchBar]; + [self.searchBar mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(KScreenHeight - self.displayHeight); + make.leading.trailing.mas_equalTo(self.view).inset(16); + make.height.mas_equalTo(34); + }]; + + [self.view addSubview:self.collectionView]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.searchBar.mas_bottom).offset(8); + make.bottom.leading.trailing.mas_equalTo(0); + }]; +} + +- (void)setupUIForHalfScreen { + self.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5]; + + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapSpace)]; + [self.view addGestureRecognizer:tap]; + + [self.view addSubview:self.titleLabel]; + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(KScreenHeight - self.displayHeight); + make.centerX.mas_equalTo(self.view); + make.height.mas_equalTo(34); + }]; + + [self.view addSubview:self.comfirmButton]; + [self.comfirmButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self.titleLabel); + make.trailing.mas_equalTo(-8); + }]; + + [self.view addSubview:self.collectionView]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(8); + make.bottom.leading.trailing.mas_equalTo(0); + }]; + + [self.view insertSubview:self.bgView belowSubview:self.titleLabel]; + [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(KScreenHeight - self.displayHeight -40); + make.leading.bottom.trailing.mas_equalTo(self.view); + }]; +} + +- (void)didTapComfirm { + // TODO: call api or call handleTapComfirm + switch (self.type) { + case 1: + [self dismissViewControllerAnimated:YES completion:nil]; + break; + case 2:{ + [self dismissViewControllerAnimated:YES completion:^{ + if (self.handleTapComfirm) { + self.handleTapComfirm(@""); + } + }]; + } + break; + default: + break; + } +} + +- (void)didTapSpace { + @kWeakify(self); + [self dismissViewControllerAnimated:YES completion:^{ + @kStrongify(self); + if (self.handleDismiss) { + self.handleDismiss(); + } + }]; +} + + +#pragma mark - UISearchBarDelegate +// 当点击 "Search" 按钮时触发 +- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { + [searchBar resignFirstResponder]; // 收起键盘 + NSLog(@"User searched for: %@", searchBar.text); + + // 触发 API 查询 +// [self fetchSearchResultsForQuery:searchBar.text]; +} + +#pragma mark - +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + // TODO: 使用 api 返回的數據 + return 100; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + RegionListCell *cell = [RegionListCell cellFor:collectionView indexPath:indexPath]; + + return cell; +} + +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + +} + +#pragma mark - +- (UISearchBar *)searchBar { + if (!_searchBar) { + UIColor *bgColor = UIColorFromRGB(0xf4f4f4); + _searchBar = [[UISearchBar alloc] init]; + _searchBar.delegate = self; + _searchBar.placeholder = YMLocalizedString(@"XPHomeSearchNavView1"); + _searchBar.barTintColor = bgColor; + [_searchBar setCornerRadius:34/2]; + if (@available(iOS 13.0, *)) { + _searchBar.searchTextField.backgroundColor = bgColor; + } else { + UITextField *searchField = [self findTextFieldInSearchBar:_searchBar]; + if (searchField) { + searchField.backgroundColor = bgColor; + } + } + } + return _searchBar; +} + +- (UICollectionView *)collectionView { + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.itemSize = CGSizeMake(KScreenWidth - 32, 48); + layout.sectionInset = UIEdgeInsetsMake(0, 16, kSafeAreaBottomHeight, 16); + layout.minimumLineSpacing = 0; + layout.minimumInteritemSpacing = 0; + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 44, KScreenWidth, KScreenHeight-44) + collectionViewLayout:layout]; + _collectionView.delegate = self; + _collectionView.dataSource = self; + _collectionView.backgroundColor = [UIColor whiteColor]; + [RegionListCell registerTo:_collectionView]; + } + return _collectionView; +} + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [UILabel labelInitWithText:YMLocalizedString(@"1.0.31_text_2") + font:kFontSemibold(16) + textColor:UIColorFromRGB(0x313131)]; + } + return _titleLabel; +} + +- (UIButton *)comfirmButton { + if (!_comfirmButton) { + _comfirmButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_comfirmButton setTitleColor:UIColorFromRGB(0xFF8C03) forState:UIControlStateNormal]; + [_comfirmButton setTitle:YMLocalizedString(@"TTAlertConfig0") forState:UIControlStateNormal]; + [_comfirmButton addTarget:self + action:@selector(didTapComfirm) + forControlEvents:UIControlEventTouchUpInside]; + } + return _comfirmButton; +} + +- (UITextField *)findTextFieldInSearchBar:(UISearchBar *)searchBar { + for (UIView *subview in searchBar.subviews) { + for (UIView *nestedSubview in subview.subviews) { + if ([nestedSubview isKindOfClass:[UITextField class]]) { + return (UITextField *)nestedSubview; + } + } + } + return nil; +} + +- (UIView *)bgView { + if (!_bgView) { + UIView *bg = [[UIView alloc] init]; + bg.backgroundColor = [UIColor whiteColor]; + [bg setCornerRadius:16 cornerMask:kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner]; + bg.userInteractionEnabled = NO; + _bgView = bg; + } + return _bgView; +} +@end diff --git a/YuMi/Modules/YMNewHome/View/XPHomePagingViewController.m b/YuMi/Modules/YMNewHome/View/XPHomePagingViewController.m index f1e561ea..67cc9368 100644 --- a/YuMi/Modules/YMNewHome/View/XPHomePagingViewController.m +++ b/YuMi/Modules/YMNewHome/View/XPHomePagingViewController.m @@ -39,6 +39,12 @@ [super viewDidLoad]; [self setup]; [self preLoadGifts]; + +//#if DEBUG +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// [self performSelector:@selector(completeUserInfo)]; +// }); +//#endif } /// 禮物面板緩存-1: 登錄後,用空的 roomUid 預加載默認禮物,並緩存 diff --git a/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m b/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m index 66b8b50d..3d2b48ec 100644 --- a/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m +++ b/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m @@ -12,6 +12,7 @@ #import #import #import +#import "SDWebImageManager.h" ///Tool #import "Api+Home.h" #import "YUMIMacroUitls.h" @@ -52,10 +53,192 @@ #import "BaseNavigationController.h" #import "XPAdImageTool.h" #import "PIHomeCategoryTitleModel.h" + +#import "RegionListViewController.h" + UIKIT_EXTERN NSString * kHomeMoreScrollPageKey; UIKIT_EXTERN NSString * const kOpenRoomNotification; -@interface XPNewHomeViewController () + +@interface HomeCategoryTabListCell : UICollectionViewCell +@property(nonatomic, assign) BOOL isSelected; +@property(nonatomic, strong) UIView *selectedBackground; +@property(nonatomic, strong) NetImageView *iconImageView; +@property(nonatomic, strong) PIHomeCategoryTitleModel *cellModel; +@property(nonatomic, copy) void(^didTapCategoryModel)(PIHomeCategoryTitleModel *model); +@end + +@implementation HomeCategoryTabListCell + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + self.backgroundColor = [UIColor clearColor]; + + [self.contentView setCornerRadius:15]; + self.contentView.backgroundColor = [UIColor whiteColor]; + [self.contentView addSubview:self.selectedBackground]; + [self.selectedBackground mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.contentView); + }]; + + [self.contentView addSubview:self.iconImageView]; + [self.iconImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.center.mas_equalTo(self.contentView); + make.size.mas_equalTo(CGSizeMake(36, 23)); + }]; + } + return self; +} + +- (void)setSelected:(BOOL)selected { + [super setSelected:selected]; + self.selectedBackground.hidden = !selected; + if (selected && self.didTapCategoryModel) { + self.didTapCategoryModel(self.cellModel); + } +} + +#pragma mark - +- (UIView *)selectedBackground { + if (!_selectedBackground) { + _selectedBackground = [[UIView alloc] init]; + _selectedBackground.backgroundColor = [UIColor whiteColor]; + [_selectedBackground setCornerRadius:15 + corners:kCALayerMaxXMaxYCorner | kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMinXMinYCorner + borderWidth:1 + borderColor:UIColorFromRGB(0xFF8C03)]; + _selectedBackground.hidden = YES; + } + return _selectedBackground; +} + +- (NetImageView *)iconImageView { + if (!_iconImageView) { + _iconImageView = [[NetImageView alloc] init]; + } + return _iconImageView; +} + +@end + +@interface HomeCategoryTabList : UIView +@property(nonatomic, strong) UIButton *arrowButton; +@property(nonatomic, strong) UICollectionView *tabCollectionView; +@property(nonatomic, copy) NSArray *tabArray; +@property(nonatomic, copy) void(^didTapCategoryModel)(PIHomeCategoryTitleModel *model); +@property(nonatomic, copy) void(^didTapArrow)(void); + +- (void)closeArrow; + +@end + +@implementation HomeCategoryTabList + +- (instancetype)init { + if (self = [super init]) { + self.backgroundColor = [[ClientConfig shareConfig] bgColor];; + [self addSubview:self.arrowButton]; + [self.arrowButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self); + make.size.mas_equalTo(CGSizeMake(24, 24)); + make.trailing.mas_equalTo(-15); + }]; + + [self addSubview:self.tabCollectionView]; + [self.tabCollectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.bottom.mas_equalTo(self); + make.leading.mas_equalTo(0); + make.trailing.mas_equalTo(self.arrowButton.mas_leading); + }]; + } + return self; +} + +- (void)handleTapArrow { + if (_didTapArrow) { + self.didTapArrow(); + } +} + +- (void)setTabArray:(NSArray *)tabArray { + _tabArray = tabArray; + [self.tabCollectionView reloadData]; + if (tabArray.count > 0) { + [self.tabCollectionView selectItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] + animated:NO + scrollPosition:UICollectionViewScrollPositionNone]; + } +} + +- (void)closeArrow { + +} + +#pragma mark - +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.tabArray.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + HomeCategoryTabListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HomeCategoryTabListCell" forIndexPath:indexPath]; + cell.cellModel = [self.tabArray xpSafeObjectAtIndex:indexPath.row]; + @kWeakify(self); + [cell setDidTapCategoryModel:^(PIHomeCategoryTitleModel *model) { + @kStrongify(self); + if (self.didTapCategoryModel) { + self.didTapCategoryModel(model); + } + }]; + return cell; +} + +#pragma mark - +- (UIButton *)arrowButton { + if (!_arrowButton) { + _arrowButton = [UIButton buttonWithType:UIButtonTypeCustom]; + _arrowButton.backgroundColor = [UIColor yellowColor]; + [_arrowButton setImage:kImage(@"common_down_arrow") + forState:UIControlStateNormal]; + [_arrowButton addTarget:self + action:@selector(handleTapArrow) + forControlEvents:UIControlEventTouchUpInside]; + } + return _arrowButton; +} + +- (UIScrollView *)tabCollectionView { + if (!_tabCollectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.itemSize = CGSizeMake(46, 30); + layout.minimumLineSpacing = 12; + layout.minimumInteritemSpacing = 12; + layout.sectionInset = UIEdgeInsetsMake(0, 14, 0, 0); + layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; + _tabCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero + collectionViewLayout:layout]; + _tabCollectionView.backgroundColor = [UIColor clearColor]; + _tabCollectionView.showsHorizontalScrollIndicator = NO; + _tabCollectionView.delegate = self; + _tabCollectionView.dataSource = self; + [_tabCollectionView registerClass:[HomeCategoryTabListCell class] + forCellWithReuseIdentifier:@"HomeCategoryTabListCell"]; + } + return _tabCollectionView; +} + +@end + + +@interface XPNewHomeViewController ()< +JXPagerViewDelegate, +JXPagerMainTableViewGestureDelegate, +JXCategoryViewDelegate, +XPHomeContainerProtocol, +XPNewHomeNavViewDelegate, +XPNewHomeHeadViewDelegate, +XPHomeRecommendOtherRoomViewDelegate, +XPHomeRecommendViewControllerDelegate> ///头视图 @property(nonatomic,strong) XPNewHomeHeadView *headView; @@ -63,6 +246,8 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; @property (nonatomic, strong) NSMutableArray *tagModelList; ///分页控件 @property (nonatomic, strong) JXCategoryTitleView *titleView; +@property(nonatomic, strong) HomeCategoryTabList *categoryTagList; + ///分页lineView @property (nonatomic, strong) JXPagerView *pagingView; @@ -137,6 +322,18 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; kWindow.rootViewController = nav; XPAdImageTool.shareImageTool.isImLogin = NO; } + +- (void)createTagScrollView { + if (_categoryTagList) { + return; + } + + [self.titleView addSubview:self.categoryTagList]; + [self.categoryTagList mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.titleView); + }]; +} + #pragma mark - Private Method - (void)initSubViews { @@ -244,6 +441,19 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; }]; } +- (void)showAllTags { + RegionListViewController *vc = [[RegionListViewController alloc] initForHomeTags]; + @kWeakify(self); + vc.handleDismiss = ^{ + @kStrongify(self); + [self.categoryTagList closeArrow]; + }; + vc.handleTapComfirm = ^(id _Nonnull obj) { + + }; + [self presentViewController:vc animated:YES completion:^{ }]; +} + #pragma mark - XPNewHomeNavViewDelegate - (void)xPNewHomeNavView:(XPNewHomeNavView *)view didClickRank:(UIButton *)sender { XPWebViewController * webVC =[[XPWebViewController alloc] initWithRoomUID:nil]; @@ -310,7 +520,7 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; return self.headView; } - (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { - return kGetScaleWidth(30); + return kGetScaleWidth(40); } - (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { return self.titleView; @@ -342,7 +552,6 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; return self.view; } - #pragma mark - JXPagerMainTableViewGestureDelegate - (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { //禁止categoryView左右滑动的时候,上下和左右都可以滚动 @@ -403,11 +612,14 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; } } self.tagModelList = list; - + self.titleView.titles = titleArray; [self.titleView reloadData]; - + + [self createTagScrollView]; + [self.categoryTagList setTabArray:list]; } + - (void)homeChatPickSuccess:(NSString *)uid { /// 跳聊天 NSString *sessionId = uid; @@ -521,17 +733,11 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; _titleView.cellSpacing = kGetScaleWidth(20); _titleView.listContainer = (id)self.pagingView.listContainerView; - -// JXCategoryIndicatorImageView * indicator = [[JXCategoryIndicatorImageView alloc] init]; -// indicator.indicatorImageView.image = kImage(@"ms_login_choose_phone_icon"); -// indicator.indicatorImageViewSize = CGSizeMake(kGetScaleWidth(24), kGetScaleWidth(24)); -// indicator.verticalMargin = -kGetScaleWidth(4); -// indicator.contentMode = UIViewContentModeScaleAspectFit; -// _titleView.indicators = @[indicator]; } return _titleView; } + - (NSMutableArray *)tagModelList{ if(!_tagModelList){ _tagModelList = [NSMutableArray array]; @@ -578,4 +784,21 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; } return _validListDict; } + +- (HomeCategoryTabList *)categoryTagList { + if (!_categoryTagList) { + _categoryTagList = [[HomeCategoryTabList alloc] init]; + @kWeakify(self); + [_categoryTagList setDidTapArrow:^{ + @kStrongify(self); + [self showAllTags]; + }]; + [_categoryTagList setDidTapCategoryModel:^(PIHomeCategoryTitleModel *model) { + @kStrongify(self); + NSInteger index = [self.tagModelList indexOfObject:model]; + [self.titleView selectItemAtIndex:index]; + }]; + } + return _categoryTagList; +} @end diff --git a/YuMi/Modules/YMRoom/View/AnimationView/XPRoomAnimationView.m b/YuMi/Modules/YMRoom/View/AnimationView/XPRoomAnimationView.m index cebfa7be..94c3c6ac 100644 --- a/YuMi/Modules/YMRoom/View/AnimationView/XPRoomAnimationView.m +++ b/YuMi/Modules/YMRoom/View/AnimationView/XPRoomAnimationView.m @@ -1098,7 +1098,7 @@ GiftAnimationDelegate> #pragma mark - 进房动画 XXX来了 - (void)userEnterRoom:(NIMChatroomNotificationContent *)content ext:(XPMessageRemoteExtModel *)extModel { - NSString *userName = content.source.nick; + NSString *userName = [NSString isEmpty:extModel.nick] ? content.source.nick : extModel.nick; if ([NSString isEmpty:userName] && content.source.userId.intValue == self.delegate.getUserInfo.uid) { userName = self.delegate.getUserInfo.nick; } else if ([NSString isEmpty:userName]) { @@ -1695,21 +1695,6 @@ GiftAnimationDelegate> } #pragma mark - 全服礼物 飘屏 -- (void)receiveBroadcastGift:(AttachmentModel *)attachment { - if ([self isInSudGame]) {return;} - GiftReceiveInfoModel *giftNotifyInfo = [GiftReceiveInfoModel modelWithJSON:attachment.data]; - ///年度飘屏是广播 在tabbar中监听 - if (giftNotifyInfo.ceremonyGift)return; - // if(giftNotifyInfo.isHomeShow == YES)return; ///房间外飘屏 在tabbar中监听 - // if(giftNotifyInfo.roomUid == self.delegate.getRoomInfo.uid)return; ///自己的房间跨房间飘屏不用走 - if (self.animationListA.count == 0 && - self.isPlayOfB == NO && - self.isPlayOfA == NO) { - [self createGiftBroadcastViewAnimation:giftNotifyInfo]; - } - [self.animationListA addObject:giftNotifyInfo]; -} - - (void)createGiftBroadcastViewAnimation:(GiftReceiveInfoModel *)giftModel { self.isPlayOfA = YES; XPRoomGiftBroadcastView * view = [[XPRoomGiftBroadcastView alloc] init]; diff --git a/YuMi/Modules/YMRoom/View/MenuContainerView/XPRoomMenuContainerView.m b/YuMi/Modules/YMRoom/View/MenuContainerView/XPRoomMenuContainerView.m index 2d69170b..3a87756b 100644 --- a/YuMi/Modules/YMRoom/View/MenuContainerView/XPRoomMenuContainerView.m +++ b/YuMi/Modules/YMRoom/View/MenuContainerView/XPRoomMenuContainerView.m @@ -444,6 +444,9 @@ UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey; [self.moreButton mas_makeConstraints:^(MASConstraintMaker *make) { make.width.height.mas_equalTo(36); }]; + [self.arrangeMicButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(36); + }]; [self.giftButton mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(CGSizeMake(46, 46)); diff --git a/YuMi/Modules/YMRoom/View/MessageContainerView/XPRoomMessageContainerView.m b/YuMi/Modules/YMRoom/View/MessageContainerView/XPRoomMessageContainerView.m index 81201861..e3cce6be 100644 --- a/YuMi/Modules/YMRoom/View/MessageContainerView/XPRoomMessageContainerView.m +++ b/YuMi/Modules/YMRoom/View/MessageContainerView/XPRoomMessageContainerView.m @@ -1014,7 +1014,7 @@ NSString * const kRoomShowTopicKey = @"kRoomShowTopicKey"; self.isMiniEnter = NO; NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject; NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content; - RoomInfoModel * roomInfo = self.hostDelegate.getRoomInfo; + RoomInfoModel *roomInfo = self.hostDelegate.getRoomInfo; if (content.eventType == NIMChatroomEventTypeEnter) { if (roomInfo.isCloseScreen) { diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/View/Cell/XPGiftItemCollectionViewCell.m b/YuMi/Modules/YMRoom/View/SendGiftView/View/Cell/XPGiftItemCollectionViewCell.m index 86723d13..16d573f4 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/View/Cell/XPGiftItemCollectionViewCell.m +++ b/YuMi/Modules/YMRoom/View/SendGiftView/View/Cell/XPGiftItemCollectionViewCell.m @@ -106,7 +106,6 @@ make.edges.mas_equalTo(self); }]; - [self.giftImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.contentView).offset(18); make.centerX.mas_equalTo(self.contentView); diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/View/PIGiftSuperGiftBroadcastView.m b/YuMi/Modules/YMRoom/View/SendGiftView/View/PIGiftSuperGiftBroadcastView.m index a5d879c1..b5a55dd7 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/View/PIGiftSuperGiftBroadcastView.m +++ b/YuMi/Modules/YMRoom/View/SendGiftView/View/PIGiftSuperGiftBroadcastView.m @@ -35,8 +35,12 @@ -(void)setGiftModel:(GiftInfoModel *)giftModel{ _giftModel = giftModel; _bgImageView.imageUrl = _giftModel.bannerUrl; + } -(void)clickBtnAction{ + if ([NSString isEmpty:_giftModel.bannerUrl]) { + return; + } if (self.delegate && [self.delegate respondsToSelector:@selector(pIGiftSuperGiftBroadcastViewClickWithModel:)]){ [self.delegate pIGiftSuperGiftBroadcastViewClickWithModel:self.giftModel]; } diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m b/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m index 076d5cf3..a964eafe 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m +++ b/YuMi/Modules/YMRoom/View/SendGiftView/View/XPSendGiftView.m @@ -633,6 +633,9 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView; } #pragma mark - PIGiftSuperGiftBroadcastViewDelegate - (void)pIGiftSuperGiftBroadcastViewClickWithModel:(GiftInfoModel *)giftModel{ + if ([NSString isEmpty:giftModel.skipUrl]) { + return; + } XPRoomHalfWebView * webView = [[XPRoomHalfWebView alloc] init]; webView.url = giftModel.skipUrl; [TTPopup popupView:webView style:TTPopupStyleActionSheet]; diff --git a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroWaveView.m b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroWaveView.m index c8510019..301c2cff 100644 --- a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroWaveView.m +++ b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroWaveView.m @@ -41,10 +41,13 @@ if (self.isAnimationing) { return; } - self.isAnimationing = YES; + + if (self.isAnimationing) { + [self.firstView.layer removeAllAnimations]; + } + self.isAnimationing = YES; self.firstView.hidden = NO; - [self animationWithLayer:self.firstView]; - + [self animationWithLayer:self.firstView]; } ///结束声波动画 - (void)stopWaveAnimation { @@ -70,7 +73,7 @@ - (void)animationWithLayer:(UIView *)view { int animtionDura = 1; POPBasicAnimation *animation2 = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerScaleXY]; - animation2.beginTime = CACurrentMediaTime(); + animation2.beginTime = CACurrentMediaTime(); animation2.duration = animtionDura; animation2.fromValue = [NSValue valueWithCGSize:CGSizeMake(1.f, 1.f)]; animation2.toValue = [NSValue valueWithCGSize:CGSizeMake(1.4f, 1.4f)]; diff --git a/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.h b/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.h new file mode 100644 index 00000000..ec28836d --- /dev/null +++ b/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.h @@ -0,0 +1,16 @@ +// +// NineteenMicStageView.h +// YuMi +// +// Created by P on 2024/12/12. +// + +#import "StageView.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface NineteenMicStageView : StageView + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.m b/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.m new file mode 100644 index 00000000..61a52f53 --- /dev/null +++ b/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.m @@ -0,0 +1,131 @@ +// +// NineteenMicStageView.m +// YuMi +// +// Created by P on 2024/12/12. +// + +#import "NineteenMicStageView.h" +#import "ArabMicroView.h" + +//第一行距离顶部 +#define firstRowTopMargin 60 +// 房主头像宽 58 + 光圈 5 +#define ownerWidth (45 + 5) * kScreenScale +// 昵称高12,距离头像间距 10 +#define ownerHeight (ownerWidth + 10 + 12) +// 下面 8 个坑位宽55 + 光圈 5 +#define mcWidth (45 + 5) * kScreenScale +#define mcHeight (mcWidth + 10 + 12 + 5+16) +// 左右 padding 20 +#define paddingH 22 * kScreenScale +// 每行间距 +#define lineMargin 8 +// 下面 8 个坑位两两之间的间距 +#define marginH (KScreenWidth - paddingH * 2 - mcWidth * 5) / 4 +// 第二行坑位的顶部 +#define sRowTop firstRowTopMargin + mcHeight + lineMargin +// 第一行坑位与第二行坑位的间距 +//#define marginV2 15 +// 第三行坑位的顶部 +#define tRowTop (sRowTop + mcHeight + lineMargin) + +static const NSInteger kMicCountPerRow = 5; + +@implementation NineteenMicStageView + +- (NSInteger)countOfMicroView { + return 19; // 麦位总数 +} + +- (UIView *)microViewForIndex:(NSInteger)index { + UIView *microView = [super microViewForIndex:index]; + return microView ?: [[ArabMicroView alloc] init]; +} + +- (CGRect)rectForViewAtIndex:(NSInteger)index { + if (index < 0 || index >= [self countOfMicroView]) { + return CGRectZero; + } + + // 第一行(5列) + if (index >= 0 && index < 5) { + return [self calculateRectForRow:0 column:index columnsInRow:5]; + } + + // 第二行(4列,居中) + if (index >= 5 && index < 9) { + return [self calculateRectForRow:1 column:index - 5 columnsInRow:4]; + } + + // 第三行(4列,居中) + if (index >= 9 && index < 13) { + return [self calculateRectForRow:2 column:index - 9 columnsInRow:4]; + } + + // 第四行(5列) + if (index >= 13 && index < 18) { + return [self calculateRectForRow:3 column:index - 13 columnsInRow:5]; + } + + // 第五行(最后一个麦位,居中,尺寸为2倍) + if (index == 18) { + CGFloat x = (KScreenWidth - mcWidth * 1.5) / 2; // 水平方向居中 +// CGFloat y = firstRowTopMargin + (mcHeight + lineMargin) * 2 - mcHeight; // 垂直方向在第 2 和第 3 行交界 + CGFloat y = firstRowTopMargin + 1 * (mcHeight + lineMargin) + mcHeight/2; + return CGRectMake(x, y, mcWidth * 1.5, mcHeight * 1.5); + } + + return CGRectZero; +} + +- (CGRect)calculateRectForRow:(NSInteger)row column:(NSInteger)column columnsInRow:(NSInteger)columnsInRow { +// CGFloat totalWidth = columnsInRow * mcWidth + (columnsInRow - 1) * marginH; // 当前行的总宽度 +// CGFloat startX = (KScreenWidth - totalWidth) / 2; // 居中计算起点 +// CGFloat x = startX + column * (mcWidth + marginH); +// CGFloat y = firstRowTopMargin + row * (mcHeight + lineMargin); +// return CGRectMake(x, y, mcWidth, mcHeight); + + CGFloat totalWidth = columnsInRow * mcWidth + (columnsInRow - 1) * marginH; // 当前行的总宽度 + CGFloat startX = (KScreenWidth - totalWidth) / 2; // 居中计算起点 + CGFloat x = 0; + + if (row == 1 || row == 2) { // 特殊处理第 2、3 行 + if (column < 2) { + // 第一、二列,从左侧开始布局 + x = paddingH + column * (mcWidth + marginH); + } else { + // 第三、四列,从右侧开始布局 + NSInteger reversedColumn = columnsInRow - 1 - column; + x = KScreenWidth - paddingH - mcWidth - reversedColumn * (mcWidth + marginH); + } + } else { + // 默认居中布局 + x = startX + column * (mcWidth + marginH); + } + + CGFloat y = firstRowTopMargin + row * (mcHeight + lineMargin); + return CGRectMake(x, y, mcWidth, mcHeight); +} + +- (CGFloat)hightForStageView { + CGFloat lastRowBottom = firstRowTopMargin + 3 * (mcHeight + lineMargin) + mcHeight; + return lastRowBottom + lineMargin; // 加上最后的间距 +} + +- (CGPoint)animationPointAtStageViewByUid:(NSString *)uid { + NSInteger index = [self getIndexByUid:uid]; + return [self animationPointAtStageViewByIndex:index]; +} + +- (CGPoint)animationPointAtStageViewByIndex:(NSInteger)index { + if (index < 0 || index >= [self countOfMicroView]) { + return CGPointZero; + } + + CGRect rect = [self rectForViewAtIndex:index]; + CGPoint center = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect)); + return [self convertPoint:center toView:nil]; +} + +@end diff --git a/YuMi/Modules/YMRoom/View/StageView/StageView.m b/YuMi/Modules/YMRoom/View/StageView/StageView.m index 77eba48b..fb3e43bf 100644 --- a/YuMi/Modules/YMRoom/View/StageView/StageView.m +++ b/YuMi/Modules/YMRoom/View/StageView/StageView.m @@ -40,6 +40,8 @@ #import "XPUserCardViewController.h" #import "XPRoomInviteUserViewController.h" +#import "UserRoomCardViewController.h" + @interface StageView() /** 云信麦序的 position 和本类 index 的关系。 @@ -353,73 +355,85 @@ 更新坑位的等级头饰 */ - (void)updatePositionItemWithRoomOnMicGiftValue:(GiftValueInfoModel *)roomOnMicGiftValue{ - if (self.hostDelegate.getRoomInfo.type == RoomType_Anchor || self.hostDelegate.getRoomInfo.roomModeType == RoomModeType_Open_Blind) return; - // 过滤礼物值为0的 - NSMutableArray *validGifts = [NSMutableArray array]; + if (self.hostDelegate.getRoomInfo.type == RoomType_Anchor || + self.hostDelegate.getRoomInfo.roomModeType == RoomModeType_Open_Blind) { + return; + } + + // Step 1: 过滤有效礼物 + NSArray *validGifts = [self filterValidGifts]; + if (validGifts.count == 0) return; + + // Step 3: 排序 + NSArray *sortedGifts = [self sortGiftsByValue:validGifts]; + + NSString *highest = nil; + NSString *lowest = nil; + + // 处理最高礼物值 + if (sortedGifts.count >= 1 && ![self hasDuplicateHighestValue:sortedGifts]) { + highest = sortedGifts.firstObject.uid; + } + // 处理最低礼物值 + if (sortedGifts.count > 1 && ![self hasDuplicateLowestValue:sortedGifts]) { + lowest = sortedGifts.lastObject.uid; + } + + // Step 4: 更新 UI + [self updateMicroViewsWithHighest:highest lowest:lowest]; +} + +// 筛选有效礼物值 +- (NSArray *)filterValidGifts { + NSMutableArray *validGifts = [NSMutableArray array]; for (int i = 0; i < self.microViews.count; i++) { - - UIView * view = [self findMicroViewByIndex:i]; + UIView *view = [self findMicroViewByIndex:i]; [view hiddenPositionisHighLevel]; long long value = [view getGiftValue]; UserInfoModel *user = [view getUser]; - if(value > 0 && user.uid > 0){ + if (value > 0 && user.uid > 0) { GiftValueDetailModel *model = [GiftValueDetailModel new]; model.giftValue = value; model.uid = @(user.uid).stringValue; [validGifts addObject:model]; } } - if (validGifts.count == 0) return; - NSMutableArray *newOnMicGifts = [NSMutableArray array]; - // 过滤厅主 - for (GiftValueDetailModel *value in validGifts) { - for (MicroQueueModel *item in self.micQueue.allValues) { - BOOL isOwnerPosition = item.microState.position == -1; - if (!isOwnerPosition && item.userInfo.uid == value.uid.integerValue) { - [newOnMicGifts addObject:value]; - } - } - } - if (newOnMicGifts.count == 0) return; - // 排序 - NSSortDescriptor *giftValueSortD = [NSSortDescriptor sortDescriptorWithKey:@"giftValue" ascending:NO]; - NSArray *giftValuesSortArray = [[newOnMicGifts sortedArrayUsingDescriptors:@[giftValueSortD]] mutableCopy]; - NSString *highest = nil; - NSString *lowest = nil; - NSInteger sortArrayCount = giftValuesSortArray.count; - if (sortArrayCount == 1) { - highest = giftValuesSortArray.firstObject.uid; - }else if (sortArrayCount == 2) { - if (giftValuesSortArray.firstObject.giftValue != giftValuesSortArray.lastObject.giftValue) { - highest = giftValuesSortArray.firstObject.uid; - lowest = giftValuesSortArray.lastObject.uid; - } - }else{ - // 如果第一个和最后一个不相等 - if (giftValuesSortArray.firstObject.giftValue != giftValuesSortArray.lastObject.giftValue) { - // 如果第一个和第二个不相等,则必有最高 - if (giftValuesSortArray.firstObject.giftValue != giftValuesSortArray[1].giftValue) { - highest = giftValuesSortArray.firstObject.uid; - } - // 如果最后一个和倒数第二个不相等,则必有最低 - if (giftValuesSortArray.lastObject.giftValue != giftValuesSortArray[sortArrayCount-2].giftValue) { - lowest = giftValuesSortArray.lastObject.uid; - } - } - } + + return validGifts; +} - for (MicroQueueModel *item in self.micQueue.allValues) { - if (highest && item.userInfo.uid == highest.integerValue) { - UIView * view = [self findMicroViewByUid:highest]; - [view updatePositionIsHighLevel:YES isShow:YES]; - continue; - } - if (lowest && item.userInfo.uid == lowest.integerValue) { - UIView * view = [self findMicroViewByUid:lowest]; - [view updatePositionIsHighLevel:NO isShow:YES]; - } - } +// 根据礼物值排序 +- (NSArray *)sortGiftsByValue:(NSArray *)gifts { + NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"giftValue" ascending:NO]; + return [gifts sortedArrayUsingDescriptors:@[sortDescriptor]]; +} + +// 检查是否存在相同最高值 +- (BOOL)hasDuplicateHighestValue:(NSArray *)sortedGifts { + if (sortedGifts.count < 2) return NO; + return sortedGifts[0].giftValue == sortedGifts[1].giftValue; +} + +// 检查是否存在相同最低值 +- (BOOL)hasDuplicateLowestValue:(NSArray *)sortedGifts { + if (sortedGifts.count < 2) return NO; + return sortedGifts[sortedGifts.count - 1].giftValue == sortedGifts[sortedGifts.count - 2].giftValue; +} + +// 更新视图 +- (void)updateMicroViewsWithHighest:(NSString *)highest lowest:(NSString *)lowest { + for (MicroQueueModel *item in self.micQueue.allValues) { + UIView *view = nil; + + if (highest && item.userInfo.uid == highest.integerValue) { + view = [self findMicroViewByUid:highest]; + [view updatePositionIsHighLevel:YES isShow:YES]; + } else if (lowest && item.userInfo.uid == lowest.integerValue) { + view = [self findMicroViewByUid:lowest]; + [view updatePositionIsHighLevel:NO isShow:YES]; + } + } } #pragma mark - RoomGuestDelegate @@ -819,6 +833,7 @@ } if (targetUid && targetUid.length > 0) { + XPUserCardInfoModel * model = [[XPUserCardInfoModel alloc] init]; model.uid = targetUid; model.position = position; @@ -829,6 +844,14 @@ model.micQueue = self.micQueue; model.delegate = self.hostDelegate; model.superMangerList = self.hostDelegate.getRoomSuperAdminList; + +#if DEBUG + UserRoomCardViewController *vc = [[UserRoomCardViewController alloc] initWithUser:model]; + vc.modalPresentationStyle = UIModalPresentationOverFullScreen; + [self.hostDelegate.getCurrentNav presentViewController:vc animated:NO completion:nil]; + return; +#endif + XPUserCardViewController * userCardVC = [[XPUserCardViewController alloc] initWithUser:model]; [self.hostDelegate.getCurrentNav presentViewController:userCardVC animated:NO completion:nil]; [StatisticsServiceHelper trackEventWithKey:StatisticsServiceEventroom_mike_click eventAttributes:@{@"actionType" : @"userCard"}]; diff --git a/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.h b/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.h new file mode 100644 index 00000000..1cfd4c88 --- /dev/null +++ b/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.h @@ -0,0 +1,18 @@ +// +// TwentyMicStageView.h +// YuMi +// +// Created by P on 2024/12/12. +// + +#import "StageView.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TwentyMicStageView : StageView + +//- (instancetype)initWithRows:(NSInteger)rows columns:(NSInteger)columns; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.m b/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.m new file mode 100644 index 00000000..71c7186a --- /dev/null +++ b/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.m @@ -0,0 +1,87 @@ +// +// TwentyMicStageView.m +// YuMi +// +// Created by P on 2024/12/12. +// + +#import "TwentyMicStageView.h" +#import "ArabMicroView.h" + +//第一行距离顶部 +#define firstRowTopMargin 60 +// 房主头像宽 58 + 光圈 5 +#define ownerWidth (45 + 5) * kScreenScale +// 昵称高12,距离头像间距 10 +#define ownerHeight (ownerWidth + 10 + 12) +// 下面 8 个坑位宽55 + 光圈 5 +#define mcWidth (45 + 5) * kScreenScale +#define mcHeight (mcWidth + 10 + 12 + 5+16) +// 左右 padding 20 +#define paddingH 22 * kScreenScale +// 每行间距 +#define lineMargin 8 +// 下面 8 个坑位两两之间的间距 +#define marginH (KScreenWidth - paddingH * 2 - mcWidth * 5) / 4 +// 第二行坑位的顶部 +#define sRowTop firstRowTopMargin + mcHeight + lineMargin +// 第一行坑位与第二行坑位的间距 +//#define marginV2 15 +// 第三行坑位的顶部 +#define tRowTop (sRowTop + mcHeight + lineMargin) + +@interface TwentyMicStageView () + +@end + +@implementation TwentyMicStageView + +static const NSInteger kMicCountPerRow = 5; + +- (NSInteger)countOfMicroView { + return 20; +} + +- (UIView *)microViewForIndex:(NSInteger)index { + UIView *microView = [super microViewForIndex:index]; + return microView ?: [[ArabMicroView alloc] init]; +} + +- (CGRect)rectForViewAtIndex:(NSInteger)index { + if (index < 0 || index >= [self countOfMicroView]) { + return CGRectZero; + } + CGPoint position = [self positionForIndex:index rowHeight:mcHeight]; + return CGRectMake(position.x - mcWidth / 2, position.y - mcHeight / 2, mcWidth, mcHeight); +} + +- (CGFloat)hightForStageView { + NSInteger rows = ceil((CGFloat)[self countOfMicroView] / kMicCountPerRow); + return firstRowTopMargin + rows * (mcHeight + lineMargin) - lineMargin; +} + +- (CGPoint)animationPointAtStageViewByUid:(NSString *)uid { + NSInteger index = [self getIndexByUid:uid]; + return [self animationPointAtStageViewByIndex:index]; +} + +- (CGPoint)animationPointAtStageViewByIndex:(NSInteger)index { + if (index < 0 || index >= [self countOfMicroView]) { + return CGPointZero; + } + CGPoint position = [self positionForIndex:index rowHeight:mcHeight]; + return [self convertPoint:position toView:nil]; +} + +#pragma mark - Helper Methods + +- (CGPoint)positionForIndex:(NSInteger)index rowHeight:(CGFloat)rowHeight { + NSInteger row = index / kMicCountPerRow; + NSInteger col = index % kMicCountPerRow; + CGFloat x = paddingH + col * (mcWidth + marginH) + mcWidth / 2; + CGFloat y = firstRowTopMargin + row * (rowHeight + lineMargin) + rowHeight / 2; + return CGPointMake(x, y); +} + + +@end diff --git a/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.m b/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.m index 4891a21c..39e6b040 100644 --- a/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.m +++ b/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.m @@ -198,7 +198,6 @@ item.isEnable = NO; item.imageName = @"usercard_invite_micro_disable"; } else { - item.isEnable = YES; item.imageName = @"usercard_invite_micro_normal"; } @@ -219,7 +218,7 @@ NSMutableArray * array = [NSMutableArray array]; XPUserCardMicroItemModel * muteItem = [[XPUserCardMicroItemModel alloc] init]; muteItem.title = userInfo.micState == MicroMicStateType_Open ? YMLocalizedString(@"XPUserCardPresenter5") : YMLocalizedString(@"XPUserCardPresenter6"); - muteItem.iconImage = userInfo.micState == MicroMicStateType_Open ? @"user_card_close_mic" : @"user_card_open_mic"; + muteItem.iconImage = userInfo.micState == MicroMicStateType_Open ? @"room_user_card_close_mic" : @"room_user_card_open_mic"; muteItem.status = userInfo.micState == MicroMicStateType_Open; muteItem.type = UserCardMicroType_Mute; @@ -228,11 +227,11 @@ upDownItem.status = userInfo.position.length > 0 ? YES : NO; upDownItem.type = UserCardMicroType_UpDown; upDownItem.uid = userInfo.uid; - upDownItem.iconImage = @"user_card_down_mic_listen"; + upDownItem.iconImage = @"room_user_card_out_mic"; XPUserCardMicroItemModel * lockItem = [[XPUserCardMicroItemModel alloc] init]; lockItem.title = userInfo.posState == MicroPosStateType_Free ? YMLocalizedString(@"XPUserCardPresenter10") : YMLocalizedString(@"XPUserCardPresenter11"); - lockItem.iconImage = userInfo.posState == MicroPosStateType_Free ? @"user_card_lock_mic" : @"user_card_no_lock_mic"; + lockItem.iconImage = userInfo.posState == MicroPosStateType_Free ? @"room_user_card_lock" : @"room_user_card_unlock"; lockItem.status = userInfo.posState == MicroPosStateType_Free; lockItem.type = UserCardMicroType_Lock; @@ -240,7 +239,7 @@ XPUserCardMicroItemModel * giftValueItem = [[XPUserCardMicroItemModel alloc] init]; giftValueItem.title = YMLocalizedString(@"XPUserCardPresenter12"); - giftValueItem.iconImage = @"user_card_clean_gift_value"; + giftValueItem.iconImage = @"room_user_card_clean_gift_value"; giftValueItem.type = UserCardMicroType_Clean_Gift_Value; ///自己是公会超管 BOOL meIsSuperAdmin = NO; @@ -628,8 +627,8 @@ if (!_giftItem) { _giftItem = [[XPUserCardItemModel alloc] init]; _giftItem.title = YMLocalizedString(@"XPUserCardPresenter13"); - _giftItem.imageName = @"usercard_sendgift_normal"; - _giftItem.selectImageName = @"usercard_sendgift_normal"; + _giftItem.imageName = @"room_user_card_send_gift"; + _giftItem.selectImageName = @"room_user_card_send_gift"; _giftItem.type = UserCardItemType_Gift; } return _giftItem; @@ -639,8 +638,8 @@ if (!_chatItem) { _chatItem = [[XPUserCardItemModel alloc] init]; _chatItem.title = YMLocalizedString(@"XPUserCardPresenter14"); - _chatItem.imageName = @"usercard_chat_normal"; - _chatItem.selectImageName = @"usercard_chat_normal"; + _chatItem.imageName = @"room_user_card_chat"; + _chatItem.selectImageName = @"room_user_card_chat"; _chatItem.type = UserCardItemType_Chat; } return _chatItem; @@ -650,8 +649,8 @@ if (!_atItem) { _atItem = [[XPUserCardItemModel alloc] init]; _atItem.title = YMLocalizedString(@"XPUserCardPresenter22"); - _atItem.imageName = @"usercard_chat_normal"; - _atItem.selectImageName = @"usercard_chat_normal"; + _atItem.imageName = @"room_user_card_at"; + _atItem.selectImageName = @"room_user_card_at"; _atItem.type = UserCardItemType_AtUser; } return _atItem; @@ -661,9 +660,9 @@ if (!_attentionItem) { _attentionItem = [[XPUserCardItemModel alloc] init]; _attentionItem.title = YMLocalizedString(@"XPUserCardPresenter15"); - _attentionItem.imageName = @"usercard_attention_normal"; + _attentionItem.imageName = @"room_user_card_follow"; _attentionItem.selectTitle = YMLocalizedString(@"XPUserCardPresenter16"); - _attentionItem.selectImageName = @"usercard_attention_disable"; + _attentionItem.selectImageName = @"room_user_card_unfollow"; _attentionItem.type = UserCardItemType_Attention; } return _attentionItem; @@ -673,8 +672,8 @@ if (!_kikoutItem) { _kikoutItem = [[XPUserCardItemModel alloc] init]; _kikoutItem.title = YMLocalizedString(@"XPUserCardPresenter17"); - _kikoutItem.imageName = @"usercard_kickout_normal"; - _kikoutItem.selectImageName = @"usercard_kickout_normal"; + _kikoutItem.imageName = @"room_user_card_kick"; + _kikoutItem.selectImageName = @"room_user_card_kick"; _kikoutItem.type = UserCardItemType_KickOut; } return _kikoutItem; @@ -684,9 +683,9 @@ if (!_managerItem) { _managerItem = [[XPUserCardItemModel alloc] init]; _managerItem.title = YMLocalizedString(@"XPUserCardPresenter18"); - _managerItem.imageName = @"usercard_manager_normal"; + _managerItem.imageName = @"room_user_card_be_manager"; _managerItem.selectTitle = YMLocalizedString(@"XPUserCardPresenter19"); - _managerItem.selectImageName = @"usercard_manager_disable"; + _managerItem.selectImageName = @"room_user_card_not_manager"; _managerItem.type = UserCardItemType_Manager; } return _managerItem; @@ -696,7 +695,7 @@ if (!_blackItem) { _blackItem = [[XPUserCardItemModel alloc] init]; _blackItem.title = YMLocalizedString(@"XPUserCardPresenter20"); - _blackItem.imageName = @"usercard_blacklist_normal"; + _blackItem.imageName = @"room_user_card_blacklist"; _blackItem.type = UserCardItemType_Black; } return _blackItem; diff --git a/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.h b/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.h new file mode 100644 index 00000000..3557f85a --- /dev/null +++ b/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.h @@ -0,0 +1,20 @@ +// +// UserRoomCardViewController.h +// YuMi +// +// Created by P on 2024/12/11. +// + +#import "MvpViewController.h" + +@class XPUserCardInfoModel; + +NS_ASSUME_NONNULL_BEGIN + +@interface UserRoomCardViewController : MvpViewController + +- (instancetype)initWithUser:(XPUserCardInfoModel *)cardInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.m b/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.m new file mode 100644 index 00000000..ab3d776f --- /dev/null +++ b/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.m @@ -0,0 +1,1500 @@ +// +// UserRoomCardViewController.m +// YuMi +// +// Created by P on 2024/12/11. +// + +#import "UserRoomCardViewController.h" + +#import "XPUserCardPresenter.h" +#import "XPRoomGiftAnimationParser.h" + +#import "XPSendGiftView.h" +#import "XPRoomSendTextView.h" +#import "XPRoomHalfMessageView.h" + +#import "UIView+VAP.h" +#import "MoliAvatar.h" +#import "UserInfoModel.h" +#import "XPKickUserModel.h" +#import "AttachmentModel.h" +#import "XPUserCardInfoModel.h" +#import "XPUserCardItemModel.h" +#import "XPUserCardMicroItemModel.h" + +@interface UserRoomCardInfoCell : UICollectionViewCell +@property(nonatomic, copy) void(^tapReport)(void); +@property(nonatomic, copy) void(^tapAvatar)(void); +@property(nonatomic, strong) UserInfoModel *userInfo; +@property(nonatomic, strong) MoliAvatar *avatar; +@property(nonatomic, strong) UIButton *reportButton; +@property(nonatomic, strong) UILabel *nameLabel; +@property(nonatomic, strong) UIButton *sexAgeButton; +@property(nonatomic, strong) UIImageView *latestMark; +@property(nonatomic, strong) UIImageView *sidMark; +@property(nonatomic, strong) UILabel *idLabel; +@property(nonatomic, strong) UIImageView *copyMark; + ++ (void)registerTo:(UICollectionView *)collectionView; ++ (UserRoomCardInfoCell *)cellFor:(UICollectionView *)collectionView + indexPath:(NSIndexPath *)indexPath + userInfo:(UserInfoModel *)userInfo + handleTapReport:(void(^)(void))tapReport + handleTapAvatar:(void(^)(void))tapAvatar; + +@end + +@implementation UserRoomCardInfoCell + ++ (void)registerTo:(UICollectionView *)collectionView { + [collectionView registerClass:[self class] + forCellWithReuseIdentifier:NSStringFromClass([self class])]; +} + ++ (UserRoomCardInfoCell *)cellFor:(UICollectionView *)collectionView + indexPath:(NSIndexPath *)indexPath + userInfo:(UserInfoModel *)userInfo + handleTapReport:(void(^)(void))tapReport + handleTapAvatar:(void(^)(void))tapAvatar { + UserRoomCardInfoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([self class]) + forIndexPath:indexPath]; + [cell.contentView setBackgroundColor:[UIColor clearColor]]; + cell.userInfo = userInfo; + cell.tapReport = tapReport; + cell.tapAvatar = tapAvatar; + + return cell; +} + +- (void)didTapCopy { + UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; + pasteboard.string = [NSString stringWithFormat:@"%ld",self.userInfo.erbanNo]; + [XNDJTDDLoadingTool showSuccessWithMessage:YMLocalizedString(@"XPUserCardViewController24")]; +} + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.clipsToBounds = NO; + self.contentView.clipsToBounds = NO; + [self.contentView addSubview:self.avatar]; + [self.avatar mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(-91/2); + make.width.height.mas_equalTo(91); + }]; + + [self.contentView addSubview:self.reportButton]; + [self.reportButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.contentView).offset(14); + make.trailing.mas_equalTo(self.contentView).offset(-8); + make.width.height.mas_equalTo(24); + }]; + + UIStackView *nameStack = [[UIStackView alloc] initWithArrangedSubviews:@[ + self.nameLabel, + self.sexAgeButton + ]]; + nameStack.distribution = UIStackViewDistributionEqualCentering; + nameStack.alignment = UIStackViewAlignmentCenter; + nameStack.spacing = 6; + [self.contentView addSubview:nameStack]; + [nameStack mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(self.avatar.mas_bottom).offset(23); + make.height.mas_equalTo(22); + }]; + + [self.sexAgeButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(35, 16)); + }]; + + UIStackView *idStack = [[UIStackView alloc] initWithArrangedSubviews:@[ + self.latestMark, + self.sidMark, + self.idLabel, + self.copyMark + ]]; + idStack.distribution = UIStackViewDistributionEqualCentering; + idStack.alignment = UIStackViewAlignmentCenter; + idStack.spacing = 2; + [self.contentView addSubview:idStack]; + [idStack mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(nameStack.mas_bottom).offset(5); + make.height.mas_equalTo(14); + }]; + + UIButton *copyAction = [UIButton buttonWithType:UIButtonTypeCustom]; + [copyAction addTarget:self action:@selector(didTapCopy) forControlEvents:UIControlEventTouchUpInside]; + [idStack addSubview:copyAction]; + [copyAction mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(idStack); + }]; + + } + return self; +} + +- (void)setUserInfo:(UserInfoModel *)userInfo { + _userInfo = userInfo; + + if (userInfo.uid == [AccountInfoStorage instance].getUid.integerValue) { + self.reportButton.hidden = YES; + } + + self.avatar.userInfo = userInfo; + + @kWeakify(self); + [self.avatar setHandleTapAvatar:^{ + @kStrongify(self); + if (self.tapAvatar) { + self.tapAvatar(); + } + }]; + + [self updateNameAndGenderInfo]; + [self updateIDInfo]; +} + +- (void)updateNameAndGenderInfo { + self.nameLabel.text = self.userInfo.nick; + UIImage *sexBackgroundImage = nil; + if (self.userInfo.gender == GenderType_Male) { + [self.sexAgeButton setImage:kImage(@"home_age_boy_icon") forState:UIControlStateNormal]; + sexBackgroundImage = [UIImage gradientColorImageFromColors:@[UIColorRGBAlpha(0x6BB3FF, 0.5),UIColorFromRGB(0x6BB3FF)] + gradientType:GradientTypeTopToBottom + imgSize:CGSizeMake(35, 16)]; + } else { + [self.sexAgeButton setImage:kImage(@"home_age_girl_icon") forState:UIControlStateNormal]; + sexBackgroundImage = [UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xF2A0C3),UIColorFromRGB(0xEB74A6)] + gradientType:GradientTypeTopToBottom + imgSize:CGSizeMake(35, 16)]; + } + [self.sexAgeButton setTitle:[NSString getAgeWithBirth:self.userInfo.birth] + forState:UIControlStateNormal]; + [self.sexAgeButton setBackgroundImage:sexBackgroundImage + forState:UIControlStateNormal]; +} + +- (void)updateIDInfo { + NSString *text = [NSString stringWithFormat:YMLocalizedString(@"XPUserCardViewController0"), self.userInfo.erbanNo]; + self.idLabel.text = text; +} + +- (void)didTapReport { + if (self.tapReport) { + self.tapReport(); + } +} + +- (void)didTapAvatar { + if (self.tapAvatar) { + self.tapAvatar(); + } +} + +- (MoliAvatar *)avatar { + if (!_avatar) { + _avatar = [[MoliAvatar alloc] init]; + _avatar.clipsToBounds = NO; + } + return _avatar; +} + +- (UIButton *)reportButton { + if (!_reportButton) { + UIButton *report = [UIButton buttonWithType:UIButtonTypeCustom]; + [report setImage:kImage(@"room_user_card_report") + forState:UIControlStateNormal]; + [report addTarget:self action:@selector(didTapReport) forControlEvents:UIControlEventTouchUpInside]; + _reportButton = report; + } + return _reportButton; +} + +- (UILabel *)nameLabel { + if (!_nameLabel) { + _nameLabel = [[UILabel alloc] init]; + _nameLabel.font = kFontMedium(15); + _nameLabel.lineBreakMode = NSLineBreakByTruncatingTail; + _nameLabel.textColor = UIColorFromRGB(0x313131); + } + return _nameLabel; +} + +- (UIButton *)sexAgeButton { + if (!_sexAgeButton) { + _sexAgeButton = [[UIButton alloc] init]; + _sexAgeButton.titleLabel.font = [UIFont systemFontOfSize:10 weight:UIFontWeightMedium]; + [_sexAgeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + _sexAgeButton.imageEdgeInsets = UIEdgeInsetsMake(0, 2, 0, 0); + _sexAgeButton.layer.cornerRadius = 14/2; + _sexAgeButton.layer.masksToBounds = YES; + [_sexAgeButton setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; + [_sexAgeButton setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical]; + } + return _sexAgeButton; +} + +- (UIImageView *)latestMark { + if (!_latestMark) { + _latestMark = [[UIImageView alloc] initWithImage:kImage(@"common_new_user")]; + } + return _latestMark; +} + +- (UIImageView *)sidMark { + if (!_sidMark) { + _sidMark = [[UIImageView alloc] initWithImage:kImage(@"common_icon_beautiful")]; // user_info_id_mark + } + return _sidMark; +} + +- (UIImageView *)copyMark { + if (!_copyMark) { + _copyMark = [[UIImageView alloc] initWithImage:kImage(@"user_card_copy")]; + } + return _copyMark; +} + +- (UILabel *)idLabel { + if (!_idLabel) { + _idLabel = [[UILabel alloc] init]; + _idLabel.font = kFontRegular(12); + _idLabel.lineBreakMode = NSLineBreakByTruncatingTail; + _idLabel.textColor = UIColorFromRGB(0x7b7b7d); + } + return _idLabel; +} + + + +@end + +@interface UserRoomCardNameplateCell : UICollectionViewCell + +@property(nonatomic, strong) UserInfoModel *userInfo; +///魅力等级 +@property (nonatomic,strong) NetImageView *charmImageView; +///VIPicon +@property (nonatomic, strong) NetImageView *vipIconImageView; +///等级 +@property (nonatomic,strong) NetImageView *experImageView; +///铭牌图片 1 +@property (nonatomic,strong) NetImageView *nameplateImageView_1; +///铭牌图片 2 +@property (nonatomic,strong) NetImageView *nameplateImageView_2; + ++ (void)registerTo:(UICollectionView *)collectionView; ++ (UserRoomCardNameplateCell *)cellFor:(UICollectionView *)collectionView + indexPath:(NSIndexPath *)indexPath + userInfo:(UserInfoModel *)userInfo; +@end + +@implementation UserRoomCardNameplateCell + ++ (void)registerTo:(UICollectionView *)collectionView { + [collectionView registerClass:[self class] + forCellWithReuseIdentifier:NSStringFromClass([self class])]; +} ++ (UserRoomCardNameplateCell *)cellFor:(UICollectionView *)collectionView + indexPath:(NSIndexPath *)indexPath + userInfo:(UserInfoModel *)userInfo { + UserRoomCardNameplateCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([self class]) + forIndexPath:indexPath]; + [cell.contentView setBackgroundColor:[UIColor clearColor]]; + cell.userInfo = userInfo; + return cell; +} + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + UIStackView *line_1_Stack = [[UIStackView alloc] initWithArrangedSubviews:@[ + self.charmImageView, + self.experImageView, + self.vipIconImageView, + self.nameplateImageView_1, + self.nameplateImageView_2 + ]]; + line_1_Stack.distribution = UIStackViewDistributionEqualSpacing; + line_1_Stack.alignment = UIStackViewAlignmentCenter; + line_1_Stack.spacing = 4; + [self.contentView addSubview:line_1_Stack]; + [line_1_Stack mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(0); + make.height.mas_equalTo(20); + }]; + + [self.experImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(34); + }]; + [self.charmImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(34); + }]; + [self.vipIconImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(30); + }]; + + [self.nameplateImageView_1 mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(72); + }]; + + [self.nameplateImageView_2 mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(72); + }]; + } + return self; +} + +- (void)setUserInfo:(UserInfoModel *)userInfo { + [self loadNameplate:userInfo.userLevelVo.experUrl tagetView:self.experImageView]; + [self loadNameplate:userInfo.userLevelVo.charmUrl tagetView:self.charmImageView]; + [self loadNameplate:userInfo.userVipInfoVO.nameplateUrl tagetView:self.vipIconImageView]; + [self loadNameplate:userInfo.nameplatePic tagetView:self.nameplateImageView_1]; + [self loadNameplate:userInfo.guildNameplateIcon tagetView:self.nameplateImageView_2]; +} + +- (void)loadNameplate:(NSString *)urlPath tagetView:(NetImageView *)view { + if (![NSString isEmpty:urlPath]) { + view.hidden = NO; + [view loadImageWithUrl:urlPath + completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) { + if (image) { + CGFloat height = 20; + CGSize imageSize = image.size; + view.image = image; + [view mas_updateConstraints:^(MASConstraintMaker *make) { + make.width.mas_equalTo(imageSize.width / imageSize.height * height); + }]; + [self.contentView layoutIfNeeded]; + } + }]; + } +} + +- (NetImageView *)charmImageView { + if (!_charmImageView) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _charmImageView = [[NetImageView alloc] initWithConfig:config]; + _charmImageView.userInteractionEnabled = YES; + _charmImageView.hidden = YES; + _charmImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _charmImageView; +} + +- (NetImageView *)vipIconImageView { + if (!_vipIconImageView) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _vipIconImageView = [[NetImageView alloc] initWithConfig:config]; + _vipIconImageView.contentMode = UIViewContentModeScaleAspectFit; + _vipIconImageView.hidden = YES; + } + return _vipIconImageView; +} + +- (NetImageView *)experImageView { + if (!_experImageView) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _experImageView = [[NetImageView alloc] initWithConfig:config]; + _experImageView.userInteractionEnabled = YES; + _experImageView.hidden = YES; + _experImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _experImageView; +} + +- (NetImageView *)nameplateImageView_1 { + if (!_nameplateImageView_1) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _nameplateImageView_1 = [[NetImageView alloc] initWithConfig:config]; + _nameplateImageView_1.userInteractionEnabled = YES; + _nameplateImageView_1.contentMode = UIViewContentModeScaleAspectFit; + } + return _nameplateImageView_1; +} + +- (NetImageView *)nameplateImageView_2 { + if (!_nameplateImageView_2) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _nameplateImageView_2 = [[NetImageView alloc] initWithConfig:config]; + _nameplateImageView_2.userInteractionEnabled = YES; + _nameplateImageView_2.contentMode = UIViewContentModeScaleAspectFit; + } + return _nameplateImageView_2; +} + +@end + +@interface UserRoomCardUserActionCell : UICollectionViewCell + +@property(nonatomic, strong) UserInfoModel *userInfo; +@property(nonatomic, copy) NSArray * models; +@property(nonatomic, strong) UIStackView *iconStack; +@property(nonatomic, copy) void(^handleTapIcon)(XPUserCardItemModel *model); + ++ (void)registerTo:(UICollectionView *)collectionView; ++ (UserRoomCardUserActionCell *)cellFor:(UICollectionView *)collectionView + indexPath:(NSIndexPath *)indexPath + userInfo:(UserInfoModel *)userInfo + models:(NSArray *)models + handleTapIcon:(void(^)(XPUserCardItemModel *model))tapIcon; + +@end + +@implementation UserRoomCardUserActionCell + ++ (void)registerTo:(UICollectionView *)collectionView { + [collectionView registerClass:[self class] + forCellWithReuseIdentifier:NSStringFromClass([self class])]; +} ++ (UserRoomCardUserActionCell *)cellFor:(UICollectionView *)collectionView + indexPath:(NSIndexPath *)indexPath + userInfo:(UserInfoModel *)userInfo + models:(NSArray *)models + handleTapIcon:(void(^)(XPUserCardItemModel *model))tapIcon { + UserRoomCardUserActionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([self class]) + forIndexPath:indexPath]; + [cell.contentView setBackgroundColor:[UIColor clearColor]]; + cell.userInfo = userInfo; + cell.models = models; + cell.handleTapIcon = tapIcon; + return cell; +} + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + [self.contentView addSubview:self.iconStack]; + [self.iconStack mas_makeConstraints:^(MASConstraintMaker *make) { + make.center.mas_equalTo(self.contentView); + make.width.lessThanOrEqualTo(self.contentView).offset(-30); + }]; + + UIView *line = [[UIView alloc] init]; + line.backgroundColor = UIColorFromRGB(0xe4e4e4); + [self.contentView addSubview:line]; + [line mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.bottom.mas_equalTo(self.contentView).offset(1); + make.width.mas_equalTo(self.contentView).offset(-30); + make.height.mas_equalTo(1); + }]; + } + return self; +} + +- (void)didTapIcon:(UIButton *)sender { + if (_handleTapIcon) { + self.handleTapIcon([self.models xpSafeObjectAtIndex:sender.tag]); + } +} + +- (void)setModels:(NSArray *)models { + _models = models; + for (UIView *subview in self.iconStack.arrangedSubviews) { + [self.iconStack removeArrangedSubview:subview]; + [subview removeFromSuperview]; + } + [models enumerateObjectsUsingBlock:^(XPUserCardItemModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + dispatch_async(dispatch_get_main_queue(), ^{ + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.tag = idx; + if (obj.isSelect) { + [button setImage:kImage(obj.selectImageName) forState:UIControlStateNormal]; + } else { + [button setImage:kImage(obj.imageName) forState:UIControlStateNormal]; + } + [button addTarget:self action:@selector(didTapIcon:) forControlEvents:UIControlEventTouchUpInside]; + [self.iconStack addArrangedSubview:button]; + [button mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(50, 50)); + }]; + }); + }]; +} + +- (UIStackView *)iconStack { + if (!_iconStack) { + _iconStack = [[UIStackView alloc] init]; + _iconStack.alignment = UIStackViewAlignmentCenter; // 子视图在垂直方向居中 + _iconStack.distribution = UIStackViewDistributionEqualCentering; // 水平 + _iconStack.spacing = 12; + } + return _iconStack; +} + +@end + +@interface UserRoomCardMicActionCell : UICollectionViewCell + +@property(nonatomic, strong) UserInfoModel *userInfo; +@property(nonatomic, copy) NSArray *models; +@property(nonatomic, strong) UIStackView *iconStack; +@property(nonatomic, strong) UIButton *pickButton; +@property(nonatomic, copy) void(^handleTapIcon)(XPUserCardItemModel *model); +@property(nonatomic, copy) void(^handleTapPick)(void); + ++ (void)registerTo:(UICollectionView *)collectionView; ++ (UserRoomCardMicActionCell *)cellFor:(UICollectionView *)collectionView + indexPath:(NSIndexPath *)indexPath + userInfo:(UserInfoModel *)userInfo + models:(NSArray *)models + handleTapIcon:(void(^)(XPUserCardItemModel *model))tapIcon; + +- (void)dispplayPick; +@end + +@implementation UserRoomCardMicActionCell + + ++ (void)registerTo:(UICollectionView *)collectionView { + [collectionView registerClass:[self class] + forCellWithReuseIdentifier:NSStringFromClass([self class])]; +} ++ (UserRoomCardMicActionCell *)cellFor:(UICollectionView *)collectionView + indexPath:(NSIndexPath *)indexPath + userInfo:(UserInfoModel *)userInfo + models:(NSArray *)models + handleTapIcon:(void(^)(XPUserCardItemModel *model))tapIcon { + UserRoomCardMicActionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([self class]) + forIndexPath:indexPath]; + [cell.contentView setBackgroundColor:[UIColor clearColor]]; + [cell.contentView setCornerRadius:19 corners:UIRectCornerBottomLeft | UIRectCornerBottomRight]; + cell.userInfo = userInfo; + cell.models = models; + cell.handleTapIcon = tapIcon; + + return cell; +} + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + [self.contentView addSubview:self.iconStack]; + [self.iconStack mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.contentView).offset(10); + make.centerX.mas_equalTo(self.contentView); + make.width.lessThanOrEqualTo(self.contentView).offset(-30); + }]; + } + return self; +} + +- (void)dispplayPick { + [self.contentView addSubview:self.pickButton]; + [self.pickButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.contentView); + make.top.mas_equalTo(self.iconStack.mas_bottom).offset(16); + make.leading.trailing.mas_equalTo(self.contentView).inset(kGetScaleWidth(80)); + make.height.mas_equalTo(36); + }]; +} + +- (void)setModels:(NSArray *)models { + _models = models; + for (UIView *subview in self.iconStack.arrangedSubviews) { + [self.iconStack removeArrangedSubview:subview]; + [subview removeFromSuperview]; + } + [models enumerateObjectsUsingBlock:^(XPUserCardItemModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + dispatch_async(dispatch_get_main_queue(), ^{ + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.tag = idx; + if (obj.isSelect) { + [button setImage:kImage([obj selectImageName]) forState:UIControlStateNormal]; + } else { + [button setImage:kImage([obj imageName]) forState:UIControlStateNormal]; + } + [button addTarget:self action:@selector(didTapIcon:) forControlEvents:UIControlEventTouchUpInside]; + [self.iconStack addArrangedSubview:button]; + [button mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(38, 38)); + }]; + }); + }]; +} + +- (void)didTapIcon:(UIButton *)sender { + if (_handleTapIcon) { + self.handleTapIcon([self.models xpSafeObjectAtIndex:sender.tag]); + } +} + +- (void)didTapPick { + if (_handleTapPick) { + self.handleTapPick(); + } +} + +- (UIStackView *)iconStack { + if (!_iconStack) { + _iconStack = [[UIStackView alloc] init]; + _iconStack.alignment = UIStackViewAlignmentCenter; // 子视图在垂直方向居中 + _iconStack.distribution = UIStackViewDistributionEqualCentering; // 水平 + _iconStack.spacing = 12; + } + return _iconStack; +} + +- (UIButton *)pickButton { + if (!_pickButton) { + _pickButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_pickButton setCornerRadius:18 + cornerMask:kCALayerMaxXMaxYCorner | kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMinXMinYCorner]; + [_pickButton addGradientBackgroundWithColors:@[ + UIColorFromRGB(0xFF5778), + UIColorFromRGB(0xDB58FF), + ] + startPoint:CGPointMake(0, 0.5) + endPoint:CGPointMake(1, 0.5) + cornerRadius:18]; + [_pickButton setTitle:YMLocalizedString(@"1.0.31_text_3") forState:UIControlStateNormal]; + [_pickButton.titleLabel setFont:kFontMedium(14)]; + [_pickButton addTarget:self action:@selector(didTapPick) forControlEvents:UIControlEventTouchUpInside]; + } + return _pickButton; +} + +@end + +@interface UserRoomCardViewController () + +@property(nonatomic, assign) CGFloat collectionViewWidth; + +@property(nonatomic, strong) UserInfoModel *userInfoModel; +@property (nonatomic,strong) XPUserCardInfoModel *cardInfo; + +@property(nonatomic, strong) NetImageView *vipBGImageView; + +@property(nonatomic, strong) VAPView *topMP4View; +@property (nonatomic, strong) XPRoomGiftAnimationParser *vapParser; +@property(nonatomic, strong) UICollectionView *collectionView; + +@property (nonatomic,copy) NSArray *datasource; +@property(nonatomic, copy) NSArray *micActions; + +@end + +@implementation UserRoomCardViewController + +- (XPUserCardPresenter *)createPresenter { + return [[XPUserCardPresenter alloc] init]; +} + +- (instancetype)initWithUser:(XPUserCardInfoModel *)cardInfo { + if (self = [super init]) { + self.modalPresentationStyle = UIModalPresentationOverFullScreen; + self.cardInfo = cardInfo; + } + return self; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + self.datasource = @[]; + self.micActions = @[]; + [self setupUI]; + [self loadUserInfo]; + [self loadFunctionsItem]; +} + +#pragma mark - +- (void)setupUI { + self.view.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.3]; + + UIButton *dismissButton = [UIButton buttonWithType:UIButtonTypeCustom]; + dismissButton.frame = self.view.bounds; + [dismissButton addTarget:self + action:@selector(didTapEmptySpace) + forControlEvents:UIControlEventTouchUpInside]; + [self.view addSubview:dismissButton]; + + + [self.view addSubview:self.collectionView]; +} + +- (void)loadUserInfo { + [self.presenter getUserInfo:self.cardInfo.uid]; +} + +- (void)loadFunctionsItem { + [self.presenter getFunctionItemsByUserInfo:self.cardInfo]; +} + +- (BOOL)configRoomDatingPickHeart { + return YES; + BOOL result = NO; + if (self.cardInfo.roomInfo.roomModeType == RoomModeType_Open_Blind && + self.cardInfo.roomInfo.blindDateState == RoomPlayDateingType_Pick && + [AccountInfoStorage instance].getUid.integerValue != self.cardInfo.uid.integerValue) { + __block MicroQueueModel * selfMicqueue; + __block MicroQueueModel * targetMicqueue; + [self.cardInfo.micQueue.allValues enumerateObjectsUsingBlock:^(MicroQueueModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (obj.userInfo && obj.userInfo.uid == [AccountInfoStorage instance].getUid.integerValue) { + selfMicqueue = obj; + } else if(obj.userInfo && obj.userInfo.uid == self.cardInfo.uid.integerValue) { + targetMicqueue = obj; + } + }]; + if (selfMicqueue.userInfo && selfMicqueue.userInfo.uid > 0 && !selfMicqueue.userInfo.hasSelectUser && selfMicqueue.microState.position != -1 && targetMicqueue.microState.position != -1) { + result = YES; + } + } + + return result; +} + +#pragma mark - +- (void)didTapEmptySpace { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)handleTapItem:(XPUserCardItemModel *)item { + NSString * roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + NSString * roomUid = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.uid]; + + switch (item.type) { + case UserCardMicroType_UpDown: + [self handleUpDown:item]; + break; + case UserCardMicroType_Lock: { + [self.presenter microLock:roomUid + state:item.status + position:self.cardInfo.position]; + } + break; + case UserCardMicroType_Mute: { + [self.presenter microMute:roomUid + state:item.status + position:self.cardInfo.position]; + } + break; + case UserCardMicroType_Clean_Gift_Value: { + [self.presenter cleanUserGiftValue:roomUid + micUid:self.cardInfo.uid]; + } + break; + case UserCardMicroType_Send_Gift: + case UserCardItemType_Gift: { + [self handleSendGift:item]; + break; + } + case UserCardItemType_Chat:{ + [self handleChat:item]; + } + break; + case UserCardItemType_Attention: { + [self.presenter attentionUser:self.cardInfo.uid + status:!item.isSelect]; + } + break; + case UserCardItemType_KickOut: { + [self handleKickOut:item]; + } + break; + case UserCardItemType_Black: { + [self handleBlackList:item]; + } + break; + case UserCardItemType_Manager: { + if ([self isSuperUser]) { + [self.presenter superAdminHandleUser:self.cardInfo.uid opt:@"1" roomUid:roomUid isSet:!item.isSelect]; + } else { + [self.presenter makeUserManager:self.cardInfo.uid roomId:roomId enable:!item.isSelect]; + } + } + break; + case UserCardItemType_Invite_Micro: { + [self handleInviteMicro:item]; + } + break; + case UserCardItemType_AtUser: { + [self handleAtUser:item]; + } + default: + break; + } +} + +- (void)handleUpDown:(XPUserCardItemModel *)item { + // VIP 防 T 权限 + if (self.userInfoModel.userVipInfoVO.preventKick && + self.userInfoModel.uid != [AccountInfoStorage instance].getUid.integerValue) { + NSString *message = [NSString stringWithFormat:YMLocalizedString(@"UserCard_1.0.17_0"), @(self.userInfoModel.userVipInfoVO.vipLevel)]; + [XNDJTDDLoadingTool showErrorWithMessage:message]; + return; + } + + NSString * roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + + if (item.status) { + if ([self isInSudGame:self.cardInfo.uid]) { + if (self.cardInfo.uid.integerValue == [AccountInfoStorage instance].getUid.integerValue) { + [self showErrorToast:YMLocalizedString(@"XPUserCardViewController18")]; + [self dismissViewControllerAnimated:YES completion:nil]; + } else { + TTAlertConfig *config = [[TTAlertConfig alloc] init]; + config.message = YMLocalizedString(@"XPUserCardViewController19"); + [TTPopup alertWithConfig:config confirmHandler:^{ + [self.presenter kickDownMicro:self.cardInfo.position roomId:roomId]; + } cancelHandler:^{ + }]; + } + return; + }else { + [self.presenter kickDownMicro:self.cardInfo.position roomId:roomId]; + } + } else { +// self.operaStackView.hidden = YES; + int micCount = (self.cardInfo.roomInfo.type == RoomType_Anchor) ? 4 : self.cardInfo.roomInfo.type == RoomType_MiniGame ? 6 : 9; + [self.presenter getRoomMicroItems:micCount cardInfo:self.cardInfo]; + } +} + +- (void)handleSendGift:(XPUserCardItemModel *)item { + [self dismissViewControllerAnimated:NO completion:nil]; + NSString * roomUid = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.uid]; + XPSendGiftView * giftView = [[XPSendGiftView alloc] initWithType:SendGiftType_Room uid:roomUid]; + giftView.delegate = self.cardInfo.delegate; + NSArray *users = [self configGiftUsers:self.cardInfo.delegate.getMicroQueue]; + [giftView configGiftUsers:users]; + [self.presentingViewController presentViewController:giftView animated:YES completion:nil]; +} + +- (void)handleChat:(XPUserCardItemModel *)item { +// if(self.delegate && [self.delegate respondsToSelector:@selector(clickChatAction)]){ +// [self.delegate clickChatAction]; +// } + [self.presentingViewController.navigationController popViewControllerAnimated:YES]; + [self dismissViewControllerAnimated:YES completion:^{ + UIViewController * controller = (UIViewController *)self.cardInfo.delegate; + XPRoomHalfMessageView *halfMessageView = [[XPRoomHalfMessageView alloc] initWithFrame:CGRectMake(0, KScreenHeight, KScreenWidth, KScreenHeight) controller:controller]; + halfMessageView.chatUserId = self.cardInfo.uid; + [controller.view addSubview:halfMessageView]; + [UIView animateWithDuration:.35 animations:^{ + CGRect rect = halfMessageView.frame; + rect.origin.y = 0; + halfMessageView.frame = rect; + }]; + }]; +} + +- (void)handleKickOut:(XPUserCardItemModel *)item { + if (self.userInfoModel.userVipInfoVO.preventKick && + self.userInfoModel.uid != [AccountInfoStorage instance].getUid.integerValue) { + NSString *message = [NSString stringWithFormat:YMLocalizedString(@"UserCard_1.0.17_0"), @(self.userInfoModel.userVipInfoVO.vipLevel)]; + [TTPopup alertWithMessage:message confirmHandler:^{ + } cancelHandler:^{ + }]; + } else { + NSString * roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + if ([self isInSudGame:self.cardInfo.uid]) { + NSString *message = YMLocalizedString(@"XPUserCardViewController8"); + TTAlertConfig *config = [[TTAlertConfig alloc] init]; + config.title = @""; + config.message = message; + [TTPopup alertWithConfig:config confirmHandler:^{ + if ([self isSuperUser]) { + [self.presenter superAdminKickUser:self.userInfoModel.nick cardInfo:self.cardInfo]; + } else { + [self.presenter makeKickUser:self.cardInfo.uid roomId:roomId]; + } + } cancelHandler:^{ + }]; + } else { + NSString *message = [NSString stringWithFormat:YMLocalizedString(@"XPUserCardViewController9"),self.userInfoModel.nick]; + TTAlertConfig *config = [[TTAlertConfig alloc] init]; + config.title = YMLocalizedString(@"XPUserCardViewController10"); + config.message = message; + [TTPopup alertWithConfig:config confirmHandler:^{ + if ([self isSuperUser]) { + [self.presenter superAdminKickUser:self.userInfoModel.nick cardInfo:self.cardInfo]; + } else { + [self.presenter makeKickUser:self.cardInfo.uid roomId:roomId]; + } + } cancelHandler:^{ + }]; + } + } +} + +- (void)handleBlackList:(XPUserCardItemModel *)item { + if (self.userInfoModel.userVipInfoVO.preventKick && + self.userInfoModel.uid != [AccountInfoStorage instance].getUid.integerValue) { + NSString *message = [NSString stringWithFormat:YMLocalizedString(@"UserCard_1.0.17_0"), @(self.userInfoModel.userVipInfoVO.vipLevel)]; + [TTPopup alertWithMessage:message confirmHandler:^{ + } cancelHandler:^{ + }]; + } else { + NSString * roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + NSString * roomUid = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.uid]; + if ([self isInSudGame:self.cardInfo.uid]) { + TTAlertConfig *config = [[TTAlertConfig alloc] init]; + config.title = @""; + config.message = [NSString stringWithFormat: YMLocalizedString(@"XPUserCardViewController14"), self.userInfoModel.nick]; + [TTPopup alertWithConfig:config confirmHandler:^{ + if ([self isSuperUser]) { + [self.presenter superAdminHandleUser:self.cardInfo.uid opt:@"-1" roomUid:roomUid isSet:YES]; + } else { + [self.presenter makeUserBlack:self.cardInfo.uid roomId:roomId]; + } + } cancelHandler:^{ + }]; + } else { + NSString *title = [NSString stringWithFormat:YMLocalizedString(@"XPUserCardViewController15"),self.userInfoModel.nick]; + TTAlertConfig *config = [[TTAlertConfig alloc] init]; + config.title = title; + config.message = YMLocalizedString(@"XPUserCardViewController16"); + [TTPopup alertWithConfig:config confirmHandler:^{ + if ([self isSuperUser]) { + [self.presenter superAdminHandleUser:self.cardInfo.uid opt:@"-1" roomUid:roomUid isSet:YES]; + }else { + [self.presenter makeUserBlack:self.cardInfo.uid roomId:roomId]; + } + } cancelHandler:^{ + }]; + } + } +} + +- (void)handleInviteMicro:(XPUserCardItemModel *)item { + NSString * roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + if ([AccountInfoStorage instance].getUid.integerValue == self.userInfoModel.uid) { + [self.presenter upMicro:roomId position:item.position userInfo:self.userInfoModel]; + } else { + if (self.cardInfo.roomInfo.leaveMode && + [item.position isEqualToString:@"-1"]) { + return; + } + + NSMutableDictionary * dic = [NSMutableDictionary dictionary]; + [dic setValue:@(item.position.integerValue) forKey:@"micPosition"]; + [dic setValue:@(self.userInfoModel.uid) forKey:@"uid"]; + AttachmentModel *attachement = [[AttachmentModel alloc]init]; + attachement.first = CustomMessageType_Queue; + attachement.second = Custom_Message_Sub_Queue_Invite; + attachement.data = dic; + + NIMMessage *message = [[NIMMessage alloc]init]; + NIMCustomObject *object = [[NIMCustomObject alloc] init]; + object.attachment = attachement; + message.messageObject = object; + //构造会话 + NIMSession *session = [NIMSession session:roomId type:NIMSessionTypeChatroom]; + [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:nil]; + [self dismissViewControllerAnimated:YES completion:nil]; + } +} + +- (void)handleAtUser:(XPUserCardItemModel *)item { + [self.presentingViewController.navigationController popViewControllerAnimated:YES]; + if (self.cardInfo.roomInfo.isCloseScreen) { + [self showErrorToast:YMLocalizedString(@"XPUserCardViewController17")]; + return; + } + [self dismissViewControllerAnimated:NO completion:^{ + UIViewController *vc = self.cardInfo.delegate.getCurrentNav.viewControllers[0]; + [XPRoomSendTextView showTextView:vc.view + delegate:self.cardInfo.delegate + atUid:self.cardInfo.uid + atNick:self.userInfoModel.nick]; + }]; +} + +- (BOOL)isInSudGame:(NSString *)uid { + BOOL isGamePlaying = NO; + if (self.cardInfo.roomInfo.type == RoomType_MiniGame) { + for (int i = -1; i<5; i++) { + NSMutableDictionary * micQueue = self.cardInfo.micQueue; + MicroQueueModel *micSequence = [micQueue objectForKey:[NSString stringWithFormat:@"%d", i]]; + if (micSequence == nil || micSequence.userInfo == nil) { + continue; + } + if (micSequence.userInfo.uid == uid.integerValue && micSequence.userInfo.gameStatus == LittleGamePlayStatus_Plying) { + isGamePlaying = YES; + break; + } + } + } + return isGamePlaying; +} + +- (BOOL)isSuperUser { + BOOL meIsSuperAdmin = NO; + for (GuildSuperAdminInfoModel *managerInfo in self.cardInfo.superMangerList) { + if ([managerInfo.uid isEqualToString:[AccountInfoStorage instance].getUid]) { + meIsSuperAdmin = YES; + } + } + return meIsSuperAdmin; +} + +- (NSArray *)configGiftUsers:(NSMutableDictionary *)queue { + NSMutableArray * array = [NSMutableArray array]; + BOOL receiveIsOnMic = NO; + for (MicroQueueModel * microModel in queue.allValues) { + if (microModel.userInfo && microModel.userInfo.uid >0) { + UserInfoModel * userInfo = microModel.userInfo; + if (userInfo.uid == self.cardInfo.uid.integerValue) { + receiveIsOnMic = YES; + } + } + } + if (receiveIsOnMic) { + for (MicroQueueModel * microModel in queue.allValues) { + if (microModel.userInfo && microModel.userInfo.uid >0) { + UserInfoModel * userInfo = microModel.userInfo; + XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init]; + userModel.avatar = userInfo.avatar; + userModel.vipMic = userInfo.vipMic; + userModel.position = [NSString stringWithFormat:@"%d", microModel.microState.position]; + userModel.uid = userInfo.uid; + if (userInfo.uid == self.cardInfo.uid.integerValue) { + userModel.isSelect = YES; + } + if (self.cardInfo.roomInfo.type == RoomType_Anchor && microModel.microState.position == -1) {///个播房一直为离开模式,不需要添加房主位 + continue; + } + [array addObject:userModel]; + } + } + + RoomInfoModel * roomInfo = self.cardInfo.roomInfo; + if (roomInfo.leaveMode) { + XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init]; + userModel.avatar = roomInfo.avatar; + userModel.position = @"-1"; + userModel.uid = self.cardInfo.uid.integerValue; + if (roomInfo.uid == self.cardInfo.uid.integerValue) { + userModel.isSelect = YES; + } + [array addObject:userModel]; + } else if (roomInfo.type == RoomType_Anchor) { + BOOL hadContainerOwner = NO; + for (UserInfoModel *userModel in array) { + if (userModel.uid == roomInfo.uid) { + hadContainerOwner = YES; + break; + } + } + if (!hadContainerOwner) { + XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init]; + userModel.avatar = roomInfo.avatar; + userModel.position = @"-1"; + userModel.uid = self.cardInfo.uid.integerValue; + if (roomInfo.uid == self.cardInfo.uid.integerValue) { + userModel.isSelect = YES; + } + [array addObject:userModel]; + } + } + } else { + XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init]; + userModel.avatar = self.userInfoModel.avatar; + userModel.nick = self.userInfoModel.nick; + userModel.uid = self.cardInfo.uid.integerValue; + userModel.isSelect = YES; + [array addObject:userModel]; + } + return array; +} + +#pragma mark - +- (void)onGetUserInfoSuccess:(UserInfoModel *)userInfo { + self.userInfoModel = userInfo; + [self.collectionView reloadData]; + + // TODO: 头像摆出来,在 z 轴最上层 + // TODO: 计算高度 + // TODO: 减少 reload 闪烁 + + if (userInfo.userVipInfoVO.vipLevel>0 && userInfo.userVipInfoVO.userCardBG.length > 0) { + [self.view insertSubview:self.vipBGImageView atIndex:0]; + [self.vipBGImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.leading.trailing.mas_equalTo(self.collectionView); + make.height.mas_equalTo(300); + }]; + self.vipBGImageView.imageUrl = [userInfo.userVipInfoVO.userCardBG stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + } + + if (userInfo.infoCardVo) { + [self.view addSubview:self.topMP4View]; + [self.topMP4View mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.mas_equalTo(self.view).inset(-34); + make.bottom.mas_equalTo(self.collectionView.mas_top).offset(160); + make.height.mas_equalTo(300); + }]; + + switch (userInfo.infoCardVo.effectType) { + case 0: + // 图片 +// self.nobleImageView.imageUrl = userInfo.infoCardVo.effect; + break; + case 1: { + NSString *resourcePath = [userInfo.infoCardVo.effect pureURLString]; + if (resourcePath.length > 0) { + @kWeakify(self); + [self.vapParser parseWithURL:resourcePath + completionBlock:^(NSString * _Nullable videoUrl) { + @kStrongify(self); + if (videoUrl.length) { + [self.topMP4View setMute:YES]; + [self.topMP4View playHWDMP4:videoUrl repeatCount:-1 delegate:nil]; + } + } failureBlock:^(NSError * _Nullable error) { + }]; + } + } + break; + default: + break; + } + } +} + +- (void)onGetFunctionArraySccess:(NSArray *)array { + NSMutableArray *temp_1 = @[].mutableCopy; + if (array.count <= 0) { + if([ [AccountInfoStorage instance].getUid isEqualToString:self.cardInfo.uid] ){ + XPUserCardItemModel *cardModel = [XPUserCardItemModel new]; + cardModel.type = UserCardMicroType_Send_Gift; + cardModel.title = YMLocalizedString(@"XPUserCardPresenter13"); + cardModel.imageName = @"room_user_card_send_gift"; + cardModel.selectImageName = @"room_user_card_send_gift"; + [temp_1 insertObject:cardModel atIndex:0]; + } + self.datasource = temp_1.copy; + [self.presenter getMicroFunctionItemsByUserInfo:self.cardInfo]; + } else { + NSMutableArray *temp_2 = @[].mutableCopy; + for (XPUserCardItemModel *model in array) { + if (model.type == UserCardItemType_Gift || + model.type == UserCardItemType_Chat || + model.type == UserCardItemType_AtUser || + model.type == UserCardItemType_Attention) { + [temp_1 addObject:model]; + } else { + [temp_2 addObject:model]; + } + } + self.datasource = temp_1.copy; + self.micActions = temp_2.copy; + [self.presenter getMicroFunctionItemsByUserInfo:self.cardInfo]; + } + [self.collectionView reloadData]; +} + +- (void)onGetMicroFunctionArraySuccess:(NSArray *)array { + if (array.count <= 0) { + + } else { + NSMutableArray *temp = [self.micActions mutableCopy]; + for (XPUserCardMicroItemModel *model in array) { + [temp addObject:[self transModelFrom:model]]; + } + self.micActions = temp; + } + + [self.collectionView reloadData]; +} + +-(void)onGetFollowDataSccess{ + [self.collectionView reloadData]; +} + +- (XPUserCardItemModel *)transModelFrom:(XPUserCardMicroItemModel *)model { + XPUserCardItemModel *cardModel = [XPUserCardItemModel new]; + cardModel.uid = model.uid; + cardModel.type = model.type; + cardModel.title = model.title; + cardModel.status = model.status; + cardModel.imageName = model.iconImage; + return cardModel; +} + +- (void)attentionUserSuccess:(XPUserCardItemModel *)item { + [self.micActions enumerateObjectsUsingBlock:^(XPUserCardItemModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (item.type == obj.type) { + obj.isSelect = item.isSelect; + *stop = YES; + } + }]; + [self.collectionView reloadData]; +} + +- (void)markUserManagerFinish:(XPUserCardItemModel *)item error:(NSError *)error { + if (error == nil) { + [self.micActions enumerateObjectsUsingBlock:^(XPUserCardItemModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (item.type == obj.type) { + obj.isSelect = item.isSelect; + *stop = YES; + } + }]; + [self.collectionView reloadData]; + } +} + +- (void)makeKickUserFinish:(NSError *)error { + if (error == nil && self.userInfoModel) { + [self dismissViewControllerAnimated:YES completion:nil]; + [self sendCustomMessageKickOrBlackUser:CustomMessageType_Kick_User second:Custom_Message_Sub_Kick_BeKicked]; + } else if (error.code == 404) { + [self showErrorToast:YMLocalizedString(@"XPUserCardViewController1")]; + } +} + +- (void)superAdminKickUserFinish:(NSError *)error { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)lockMicroSusccess { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)muteMicroSusccess { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)kickDownMicroSuccess { + if (self.cardInfo.uid.integerValue != [AccountInfoStorage instance].getUid.integerValue) { + [self sendCustomMessageKickOrBlackUser:CustomMessageType_Queue second:Custom_Message_Sub_Queue_Kick]; + } + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)upMicroSuccess { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)cleanUserGiftValueSuccess:(NSDictionary *)dic { + [self showSuccessToast:YMLocalizedString(@"XPUserCardViewController3")]; + NIMMessage * message = [[NIMMessage alloc] init]; + AttachmentModel * attachMent = [[AttachmentModel alloc] init]; + attachMent.first = CustomMessageType_Room_GiftValue; + attachMent.second = Custom_Message_Sub_Room_GiftValue_Sync; + attachMent.data = dic; + NIMCustomObject *object = [[NIMCustomObject alloc] init]; + object.attachment = attachMent; + message.messageObject = object; + //构造会话 + NSString * sessionId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + NIMSession *session = [NIMSession session:sessionId type:NIMSessionTypeChatroom]; + [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:nil]; + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)roomDatingPickHeartUserSuccess { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)makeUserBlackFinish:(NSError *)error { + if (error == nil && self.userInfoModel) { + [self dismissViewControllerAnimated:YES completion:nil]; + if (self.cardInfo.position.length > 0) { + NIMChatroomQueueRemoveRequest *request = [[NIMChatroomQueueRemoveRequest alloc]init]; + request.key = self.cardInfo.position; + request.roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + [[NIMSDK sharedSDK].chatroomManager removeChatroomQueueObject:request completion:^(NSError * _Nullable error, NSDictionary * _Nullable element) { + if (error == nil ) { + } + }]; + } + [self sendCustomMessageKickOrBlackUser:CustomMessageType_Kick_User second:Custom_Message_Sub_Kick_BlackList]; + } else if (error.code == 417) { + [self showErrorToast:YMLocalizedString(@"XPUserCardViewController2")]; + } +} + +- (void)superAdminHandleUserSuccess:(NSString *)opt { + [self showSuccessToast:YMLocalizedString(@"XPUserCardViewController4")]; + [self dismissViewControllerAnimated:YES completion:nil]; + if ([opt isEqualToString:@"-1"]) {///拉黑 + if (self.cardInfo.position.length > 0) { + NIMChatroomQueueRemoveRequest *request = [[NIMChatroomQueueRemoveRequest alloc]init]; + request.key = self.cardInfo.position; + request.roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + [[NIMSDK sharedSDK].chatroomManager removeChatroomQueueObject:request completion:^(NSError * _Nullable error, NSDictionary * _Nullable element) { + if (error == nil ) { + } + }]; + } + [self sendCustomMessageKickOrBlackUser:CustomMessageType_Kick_User second:Custom_Message_Sub_Kick_BlackList]; + } +} + +///拉黑/踢出房间 发送自定义消息 +- (void)sendCustomMessageKickOrBlackUser:(int)first second:(int)second { + RoomInfoModel * roomInfo = self.cardInfo.roomInfo; + XPKickUserModel *notifyModel = [[XPKickUserModel alloc] init]; + notifyModel.handleNick = self.cardInfo.nick; + notifyModel.handleUid = [AccountInfoStorage instance].getUid.integerValue; + notifyModel.targetUid = self.cardInfo.uid.integerValue; + notifyModel.targetNick = self.userInfoModel.nick; + notifyModel.uid = self.cardInfo.uid.integerValue; + AttachmentModel *attachment = [[AttachmentModel alloc] init]; + attachment.first = first; + attachment.second = second; + attachment.data = [notifyModel model2dictionary]; + NSString * sessionId = [NSString stringWithFormat:@"%ld", roomInfo.roomId]; + + NIMMessage *message = [[NIMMessage alloc]init]; + NIMCustomObject *object = [[NIMCustomObject alloc] init]; + object.attachment = attachment; + message.messageObject = object; + //构造会话 + NIMSession *session = [NIMSession session:sessionId type:NIMSessionTypeChatroom]; + [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:nil]; +} + +#pragma mark - +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return 4; +} + +- (CGSize)collectionView:(UICollectionView *)collectionView + layout:(UICollectionViewLayout *)collectionViewLayout + sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + switch (indexPath.row) { + case 0: + return CGSizeMake(self.collectionViewWidth, 120); + break; + case 1: + return CGSizeMake(self.collectionViewWidth, 30); + break; + case 2: + return CGSizeMake(self.collectionViewWidth, 60); + break; + case 3: + return CGSizeMake(self.collectionViewWidth, 38 + 16 + 12 + ([self configRoomDatingPickHeart] ? 36 + 32 : 0)); + break; + default: + return CGSizeZero; + break; + } +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + switch (indexPath.row) { + case 0: { + UserRoomCardInfoCell *cell = [UserRoomCardInfoCell cellFor:collectionView + indexPath:indexPath + userInfo:self.userInfoModel + handleTapReport:^{ + + } + handleTapAvatar:^{ + + }]; + return cell; + } + break; + case 1: { + UserRoomCardNameplateCell *cell = [UserRoomCardNameplateCell cellFor:collectionView + indexPath:indexPath + userInfo:self.userInfoModel]; + return cell; + } + break; + case 2: { + @kWeakify(self); + UserRoomCardUserActionCell *cell = [UserRoomCardUserActionCell cellFor:collectionView + indexPath:indexPath + userInfo:self.userInfoModel + models:self.datasource + handleTapIcon:^(XPUserCardItemModel *model) { + @kStrongify(self); + [self handleTapItem:model]; + }]; + return cell; + } + break; + case 3: { + @kWeakify(self); + UserRoomCardMicActionCell *cell = [UserRoomCardMicActionCell cellFor:collectionView + indexPath:indexPath + userInfo:self.userInfoModel + models:self.micActions + handleTapIcon:^(XPUserCardItemModel *model) { + @kStrongify(self); + [self handleTapItem:model]; + }]; + if ([self configRoomDatingPickHeart]) { + [cell dispplayPick]; + } + return cell; + } + break; + default: { + UICollectionViewCell *cell = [UICollectionViewCell new]; + return cell; + } + break; + } +} + + +#pragma mark - +- (UICollectionView *)collectionView { + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.minimumLineSpacing = 0; + layout.minimumInteritemSpacing = 0; +// CGFloat space = kGetScaleWidth(45); + CGFloat space_top = kGetScaleWidth(300); + self.collectionViewWidth = KScreenWidth; + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, + space_top, + KScreenWidth, + KScreenHeight-space_top) + collectionViewLayout:layout]; + [_collectionView setCornerRadius:16]; + _collectionView.backgroundColor = [UIColor clearColor]; + _collectionView.delegate = self; + _collectionView.dataSource = self; + _collectionView.clipsToBounds = NO; + [UserRoomCardInfoCell registerTo:_collectionView]; + [UserRoomCardNameplateCell registerTo:_collectionView]; + [UserRoomCardUserActionCell registerTo:_collectionView]; + [UserRoomCardMicActionCell registerTo:_collectionView]; + } + return _collectionView; +} + +- (VAPView *)topMP4View { + if (!_topMP4View) { + _topMP4View = [[VAPView alloc] init]; + _topMP4View.contentMode = UIViewContentModeScaleAspectFill; + _topMP4View.userInteractionEnabled = NO; + } + return _topMP4View; +} + +- (XPRoomGiftAnimationParser *)vapParser { + if (!_vapParser) { + _vapParser = [[XPRoomGiftAnimationParser alloc] init]; + } + return _vapParser; +} + +- (NetImageView *)vipBGImageView { + if (!_vipBGImageView) { + _vipBGImageView = [[NetImageView alloc] init]; + _vipBGImageView.contentMode = UIViewContentModeScaleAspectFill; + _vipBGImageView.clipsToBounds = YES; + [_vipBGImageView setCornerRadius:16 cornerMask:kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner]; + } + return _vipBGImageView; +} + +@end diff --git a/YuMi/Modules/YMRoom/View/XPRoomViewController.m b/YuMi/Modules/YMRoom/View/XPRoomViewController.m index 030efad8..9f6655ed 100644 --- a/YuMi/Modules/YMRoom/View/XPRoomViewController.m +++ b/YuMi/Modules/YMRoom/View/XPRoomViewController.m @@ -50,6 +50,8 @@ #import "SocialStageView.h" #import "TenMicStageView.h" #import "FifteenMicStageView.h" +#import "NineteenMicStageView.h" +#import "TwentyMicStageView.h" #import "DatingStageView.h" #import "AnchorStageView.h" #import "AnchorPkStageView.h" @@ -130,6 +132,8 @@ XPCandyTreeInsufficientBalanceViewDelegate> @property (nonatomic,strong) StageView *stageView; @property (nonatomic,strong) TenMicStageView *tenMicStageView; @property (nonatomic,strong) FifteenMicStageView *fifteenMicStageView; +@property (nonatomic,strong) TwentyMicStageView *twentyMicStageView; +@property(nonatomic, strong) NineteenMicStageView *nineteenMicStageView; ///公屏 @property (nonatomic,strong) MsRoomMessageMainView *messageContainerView; ///快捷发言 @@ -539,6 +543,14 @@ XPCandyTreeInsufficientBalanceViewDelegate> [self.view addSubview:self.animationView]; } +- (void)__layoutTwentyMicStage { + [self.stageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.mas_equalTo(self.view); + make.top.mas_equalTo(self.roomHeaderView.mas_bottom); + make.height.mas_equalTo(self.stageView.hightForStageView); + }]; +} + - (void)__layoutFifteenMicStage { [self.stageView mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.mas_equalTo(self.view); @@ -829,7 +841,12 @@ XPCandyTreeInsufficientBalanceViewDelegate> } else if (roomInfo.type == RoomType_MiniGame) { return [LittleGameScrollStageView class]; } else if (roomInfo.type == RoomType_15Mic) { +#if DEBUG + return [NineteenMicStageView class]; +// return [TwentyMicStageView class]; +#endif return [FifteenMicStageView class]; + } else if (roomInfo.type == RoomType_10Mic) { return [TenMicStageView class]; } else if (roomInfo.hadChangeRoomType && ![self.stageView isKindOfClass:[SocialStageView class]]) { @@ -877,7 +894,6 @@ XPCandyTreeInsufficientBalanceViewDelegate> }]; [self.activityContainerView mas_remakeConstraints:^(MASConstraintMaker *make) { -// make.height.mas_equalTo(115); make.trailing.mas_equalTo(self.view); make.bottom.mas_equalTo(self.quickMessageContainerView.mas_top).offset(-5); make.width.mas_equalTo(87); @@ -1863,7 +1879,12 @@ XPCandyTreeInsufficientBalanceViewDelegate> } else if (self.roomInfo.type == RoomType_15Mic) { [self __layoutFifteenMicStage]; [self changeStageViewOnRoomUpdate]; +#if DEBUG +// [self.twentyMicStageView onRoomUpdate]; + [self.nineteenMicStageView onRoomUpdate]; +#else [self.fifteenMicStageView onRoomUpdate]; +#endif } else if (self.roomInfo.type == RoomType_10Mic) { [self __layoutTenMicStage]; [self changeStageViewOnRoomUpdate]; @@ -2730,6 +2751,20 @@ XPCandyTreeInsufficientBalanceViewDelegate> return _tenMicStageView; } +- (NineteenMicStageView *)nineteenMicStageView { + if (!_nineteenMicStageView) { + _nineteenMicStageView = [[NineteenMicStageView alloc] initWithDelegate:self]; + } + return _nineteenMicStageView; +} + +- (TwentyMicStageView *)twentyMicStageView { + if (!_twentyMicStageView) { + _twentyMicStageView = [[TwentyMicStageView alloc] initWithDelegate:self]; + } + return _twentyMicStageView; +} + - (FifteenMicStageView *)fifteenMicStageView { if (!_fifteenMicStageView) { _fifteenMicStageView = [[FifteenMicStageView alloc] initWithDelegate:self]; diff --git a/YuMi/Structure/MVP/Model/UserInfoModel.h b/YuMi/Structure/MVP/Model/UserInfoModel.h index 993515e8..e5dc77df 100644 --- a/YuMi/Structure/MVP/Model/UserInfoModel.h +++ b/YuMi/Structure/MVP/Model/UserInfoModel.h @@ -195,6 +195,8 @@ NS_ASSUME_NONNULL_BEGIN /// 是否超管身份 @property(nonatomic, assign) BOOL hasSuperRole; +@property(nonatomic, copy) NSString *guildNameplateIcon; + - (BOOL)isUserValid; - (NSString *)userIDString; diff --git a/YuMi/Tools/IAPHelper/RechargeStorage.m b/YuMi/Tools/IAPHelper/RechargeStorage.m index 16646d29..e3ffd8b6 100644 --- a/YuMi/Tools/IAPHelper/RechargeStorage.m +++ b/YuMi/Tools/IAPHelper/RechargeStorage.m @@ -7,7 +7,7 @@ #import "RechargeStorage.h" #import - + #define kAppStoreKey @"kAppStoreKey" static diff --git a/YuMi/ar.lproj/Localizable.strings b/YuMi/ar.lproj/Localizable.strings index b2232938..61b5fc0d 100644 --- a/YuMi/ar.lproj/Localizable.strings +++ b/YuMi/ar.lproj/Localizable.strings @@ -4030,3 +4030,8 @@ ineHeadView12" = "الحمل"; "1.0.30_text_29" = "سبب الحظر"; "1.0.30_text_30" = "يرجى إدخال سبب الحظر، والذي سيكون مرئيًا في الخلفية"; "1.0.30_text_31" = "حظر"; + +"1.0.31_text_0" = "Country/Region"; +"1.0.31_text_1" = "Select Country/Region"; +"1.0.31_text_2" = "Country/Region List"; +"1.0.31_text_3" = "Selective cardiography"; diff --git a/YuMi/en.lproj/Localizable.strings b/YuMi/en.lproj/Localizable.strings index 5ca7a746..de1d5867 100644 --- a/YuMi/en.lproj/Localizable.strings +++ b/YuMi/en.lproj/Localizable.strings @@ -3824,3 +3824,8 @@ "1.0.30_text_30" = "Please enter the block reason, which will be visible in the background"; "1.0.30_text_31" = "Block"; +"1.0.31_text_0" = "Country/Region"; +"1.0.31_text_1" = "Select Country/Region"; +"1.0.31_text_2" = "Country/Region List"; +"1.0.31_text_3" = "Selective cardiography"; + diff --git a/YuMi/tr.lproj/Localizable.strings b/YuMi/tr.lproj/Localizable.strings index bfdb5508..41101bfd 100644 --- a/YuMi/tr.lproj/Localizable.strings +++ b/YuMi/tr.lproj/Localizable.strings @@ -307,7 +307,7 @@ "XPMineNewUserRechargeView2" = "%zd saat %zd dakika"; "XPMineNewUserRechargeView3" = "%zd dakika"; -"XPMineAccountView0" = "Altın Bakiyesi"; +"XPMineAccountView0" = "Jeton bakiyesi"; "XPMineVerifIdentityView0" = "Doğrulama Kodu Gönder"; @@ -3609,3 +3609,8 @@ "1.0.30_text_29" = "Engellenme nedeni"; "1.0.30_text_30" = "Lütfen arka planda görünecek olan engelleme nedenini girin"; "1.0.30_text_31" = "Engelleme"; + +"1.0.31_text_0" = "Country/Region"; +"1.0.31_text_1" = "Select Country/Region"; +"1.0.31_text_2" = "Country/Region List"; +"1.0.31_text_3" = "Selective cardiography"; diff --git a/YuMi/zh-Hant.lproj/Localizable.strings b/YuMi/zh-Hant.lproj/Localizable.strings index 1d4bc99e..8a87ab33 100644 --- a/YuMi/zh-Hant.lproj/Localizable.strings +++ b/YuMi/zh-Hant.lproj/Localizable.strings @@ -3481,3 +3481,8 @@ "1.0.30_text_29" = "封禁原因"; "1.0.30_text_30" = "请输入封禁原因,该原因将在后台可见"; "1.0.30_text_31" = "封禁"; + +"1.0.31_text_0" = "Country/Region"; +"1.0.31_text_1" = "Select Country/Region"; +"1.0.31_text_2" = "Country/Region List"; +"1.0.31_text_3" = "Selective cardiography";