From 0ce0b911adf5f8544e8738c4136afa89719674fc Mon Sep 17 00:00:00 2001 From: chenguilong <598604202@qq.com> Date: Mon, 14 Feb 2022 20:23:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AA=E6=92=AD=E6=88=BFUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Podfile.lock | 2 +- xplan-ios.xcodeproj/project.pbxproj | 24 +- .../Assets.xcassets/Room/Anchor/Contents.json | 6 + .../Contents.json | 22 ++ .../room_game_position_boss@2x.png | Bin 0 -> 3305 bytes .../room_game_position_boss@3x.png | Bin 0 -> 5822 bytes xplan-ios/Main/IM/Model/AttachmentModel.h | 2 + xplan-ios/Main/Room/Model/RoomInfoModel.h | 3 +- .../MoreView/Presenter/XPMoreMenuPresenter.m | 2 +- .../Room/View/StageView/AnchorStageView.h | 16 ++ .../Room/View/StageView/AnchorStageView.m | 241 ++++++++++++++++++ .../MicroView/Anchor/AnchorMicroView.h | 16 ++ .../MicroView/Anchor/AnchorMicroView.m | 56 ++++ .../Room/View/StageView/MicroView/MicroView.h | 8 + .../Room/View/StageView/MicroView/MicroView.m | 3 - .../UserCard/Presenter/XPUserCardPresenter.m | 11 +- .../Main/Room/View/XPRoomViewController.m | 9 +- 17 files changed, 410 insertions(+), 11 deletions(-) create mode 100644 xplan-ios/Assets.xcassets/Room/Anchor/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/Contents.json create mode 100644 xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/room_game_position_boss@2x.png create mode 100644 xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/room_game_position_boss@3x.png create mode 100644 xplan-ios/Main/Room/View/StageView/AnchorStageView.h create mode 100644 xplan-ios/Main/Room/View/StageView/AnchorStageView.m create mode 100644 xplan-ios/Main/Room/View/StageView/MicroView/Anchor/AnchorMicroView.h create mode 100644 xplan-ios/Main/Room/View/StageView/MicroView/Anchor/AnchorMicroView.m diff --git a/Podfile.lock b/Podfile.lock index e166c20d..72548075 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -201,4 +201,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 1fa9307cda450b37197ea1356c5e0679d82d1d41 -COCOAPODS: 1.11.0 +COCOAPODS: 1.11.2 diff --git a/xplan-ios.xcodeproj/project.pbxproj b/xplan-ios.xcodeproj/project.pbxproj index 0871b7b6..2648299d 100644 --- a/xplan-ios.xcodeproj/project.pbxproj +++ b/xplan-ios.xcodeproj/project.pbxproj @@ -110,6 +110,8 @@ 18F404C3276098F100A6C548 /* Api+Message.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F404C2276098F100A6C548 /* Api+Message.m */; }; 18F404C927609A4300A6C548 /* MessagePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 18F404C827609A4300A6C548 /* MessagePresenter.m */; }; 73FFADDC93E195344047A2EC /* Pods_xplan_ios.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CACF623970097D653132D69A /* Pods_xplan_ios.framework */; }; + 9B0086C627BA392B0032BD2B /* AnchorStageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B0086C527BA392B0032BD2B /* AnchorStageView.m */; }; + 9B0086CA27BA4F570032BD2B /* AnchorMicroView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B0086C927BA4F570032BD2B /* AnchorMicroView.m */; }; 9B0E1C5926E77022005D4442 /* BaseNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B0E1C5826E77022005D4442 /* BaseNavigationController.m */; }; 9B7D804A2753783D003DAC0C /* SessionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B7D80492753783D003DAC0C /* SessionViewController.m */; }; 9B7D804D27537950003DAC0C /* MessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B7D804C27537950003DAC0C /* MessageCell.m */; }; @@ -629,6 +631,10 @@ 18F404C727609A4300A6C548 /* MessagePresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MessagePresenter.h; sourceTree = ""; }; 18F404C827609A4300A6C548 /* MessagePresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MessagePresenter.m; sourceTree = ""; }; 7DB00EC07F1D0ADFF900B38D /* Pods-xplan-ios.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-xplan-ios.debug.xcconfig"; path = "Target Support Files/Pods-xplan-ios/Pods-xplan-ios.debug.xcconfig"; sourceTree = ""; }; + 9B0086C427BA392B0032BD2B /* AnchorStageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AnchorStageView.h; sourceTree = ""; }; + 9B0086C527BA392B0032BD2B /* AnchorStageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AnchorStageView.m; sourceTree = ""; }; + 9B0086C827BA4F570032BD2B /* AnchorMicroView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AnchorMicroView.h; sourceTree = ""; }; + 9B0086C927BA4F570032BD2B /* AnchorMicroView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AnchorMicroView.m; sourceTree = ""; }; 9B0E1C5726E77022005D4442 /* BaseNavigationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BaseNavigationController.h; sourceTree = ""; }; 9B0E1C5826E77022005D4442 /* BaseNavigationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BaseNavigationController.m; sourceTree = ""; }; 9B7D80482753783D003DAC0C /* SessionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SessionViewController.h; sourceTree = ""; }; @@ -1911,6 +1917,15 @@ path = Protocol; sourceTree = ""; }; + 9B0086C727BA4F4A0032BD2B /* Anchor */ = { + isa = PBXGroup; + children = ( + 9B0086C827BA4F570032BD2B /* AnchorMicroView.h */, + 9B0086C927BA4F570032BD2B /* AnchorMicroView.m */, + ); + path = Anchor; + sourceTree = ""; + }; 9B7D804727537819003DAC0C /* Session */ = { isa = PBXGroup; children = ( @@ -2540,6 +2555,7 @@ E8680707271959090024F48F /* MicroView */ = { isa = PBXGroup; children = ( + 9B0086C727BA4F4A0032BD2B /* Anchor */, E8899C7C27853B46007944BE /* Dating */, 180806DA27297269001FD836 /* MicroViewProtocol.h */, E8680716271967B00024F48F /* MicroView.h */, @@ -3073,6 +3089,8 @@ 181D7F202727D9DB00B7C059 /* SocialStageView.m */, E877A7E92783E24700EFACED /* DatingStageView.h */, E877A7EA2783E24700EFACED /* DatingStageView.m */, + 9B0086C427BA392B0032BD2B /* AnchorStageView.h */, + 9B0086C527BA392B0032BD2B /* AnchorStageView.m */, ); path = StageView; sourceTree = ""; @@ -3748,6 +3766,7 @@ E8E70D8926F2F58F00F03460 /* XPMineMatchTableViewCell.m in Sources */, E88B5CA826FB089C00DA9178 /* XPMineTeenagePwdViewController.m in Sources */, E81C1B2F277071670020D1E4 /* XPArrangeMicInfoModel.m in Sources */, + 9B0086CA27BA4F570032BD2B /* AnchorMicroView.m in Sources */, E81C279626EB39CC0031E639 /* LoginForgetPasswordPresent.m in Sources */, 18EE3FF42750FA3700A452BF /* UIView+NIM.m in Sources */, E8A03DFF27635F960098D9EA /* XPRoomCandyGiftView.m in Sources */, @@ -4019,6 +4038,7 @@ E88B5CB826FB325200DA9178 /* XPMineTeenagerPwdPresenter.m in Sources */, E84B0E462727EF9D008818C6 /* XPRoomMessageParser.m in Sources */, E838D9A0275E1BF60079E0B5 /* XPRoomAnimationView.m in Sources */, + 9B0086C627BA392B0032BD2B /* AnchorStageView.m in Sources */, E874B88827215D39003954B9 /* MicroStateModel.m in Sources */, E877A7F427842EF800EFACED /* XPRoomDatingVipUpMicView.m in Sources */, E896EF9F2771AE7B00AD2CC1 /* XPMineAttentionViewController.m in Sources */, @@ -4178,7 +4198,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 4.1.0; + MARKETING_VERSION = 4.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.yinyou.enterprise.ios; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = 1; @@ -4208,7 +4228,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 4.1.0; + MARKETING_VERSION = 4.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.yinyou.enterprise.ios; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = 1; diff --git a/xplan-ios/Assets.xcassets/Room/Anchor/Contents.json b/xplan-ios/Assets.xcassets/Room/Anchor/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/xplan-ios/Assets.xcassets/Room/Anchor/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/Contents.json b/xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/Contents.json new file mode 100644 index 00000000..00d9a725 --- /dev/null +++ b/xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "room_game_position_boss@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "room_game_position_boss@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/room_game_position_boss@2x.png b/xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/room_game_position_boss@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ae896870b2b36f3a4fe7d7e2880f392a5affd330 GIT binary patch literal 3305 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 literal 0 HcmV?d00001 diff --git a/xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/room_game_position_boss@3x.png b/xplan-ios/Assets.xcassets/Room/Anchor/room_game_position_boss.imageset/room_game_position_boss@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..408827bfbc771a2ac91e259386df37972a790200 GIT binary patch literal 5822 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 IM6N<$g5%@cB>(^b literal 0 HcmV?d00001 diff --git a/xplan-ios/Main/IM/Model/AttachmentModel.h b/xplan-ios/Main/IM/Model/AttachmentModel.h index 6db202bb..348a0a02 100644 --- a/xplan-ios/Main/IM/Model/AttachmentModel.h +++ b/xplan-ios/Main/IM/Model/AttachmentModel.h @@ -42,6 +42,8 @@ typedef NS_ENUM(NSUInteger, CustomMessageType) { CustomMessageType_RoomPlay_Dating = 72, ///首充奖励 CustomMessageType_First_Recharge_Reward = 76, + ///个播房观众点击空坑位,房主收到请求上麦提示 + Custom_Noti_Header_AnchorRoom_AudienceUpMic = 86, }; diff --git a/xplan-ios/Main/Room/Model/RoomInfoModel.h b/xplan-ios/Main/Room/Model/RoomInfoModel.h index fb92a8dc..08778165 100644 --- a/xplan-ios/Main/Room/Model/RoomInfoModel.h +++ b/xplan-ios/Main/Room/Model/RoomInfoModel.h @@ -10,7 +10,8 @@ NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSInteger, RoomType) { - RoomType_Game = 3, + RoomType_Game = 3, + RoomType_Anchor = 6 // 个播房 }; typedef NS_ENUM(NSInteger, RoomModeType){ diff --git a/xplan-ios/Main/Room/View/MoreView/Presenter/XPMoreMenuPresenter.m b/xplan-ios/Main/Room/View/MoreView/Presenter/XPMoreMenuPresenter.m index 36975cef..7ba213bf 100644 --- a/xplan-ios/Main/Room/View/MoreView/Presenter/XPMoreMenuPresenter.m +++ b/xplan-ios/Main/Room/View/MoreView/Presenter/XPMoreMenuPresenter.m @@ -68,7 +68,7 @@ if (isCreator || isManager) { - if (roomInfo.canOpenBlindDate) { + if (roomInfo.canOpenBlindDate && roomInfo.type != RoomType_Anchor) { [array addObject:dating]; } [array addObject:messageScreen]; diff --git a/xplan-ios/Main/Room/View/StageView/AnchorStageView.h b/xplan-ios/Main/Room/View/StageView/AnchorStageView.h new file mode 100644 index 00000000..3696cbe1 --- /dev/null +++ b/xplan-ios/Main/Room/View/StageView/AnchorStageView.h @@ -0,0 +1,16 @@ +// +// AnchorStageView.h +// xplan-ios +// +// Created by GreenLand on 2022/2/14. +// + +#import "StageView.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface AnchorStageView : StageView + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Room/View/StageView/AnchorStageView.m b/xplan-ios/Main/Room/View/StageView/AnchorStageView.m new file mode 100644 index 00000000..f56c6a31 --- /dev/null +++ b/xplan-ios/Main/Room/View/StageView/AnchorStageView.m @@ -0,0 +1,241 @@ +// +// AnchorStageView.m +// xplan-ios +// +// Created by GreenLand on 2022/2/14. +// + +#import "AnchorStageView.h" +///Third +#import +#import +///Tool +#import "AccountInfoStorage.h" +#import "XCHudTool.h" +#import "XPMacro.h" +#import "TTPopup.h" +#import "Api+Room.h" +///Model +#import "RoomInfoModel.h" +#import "MicroExtModel.h" +#import "XPUserCardInfoModel.h" +#import "AttachmentModel.h" +///View +#import "AnchorMicroView.h" +#import "XPUserCardViewController.h" +#import "XPRoomInviteUserViewController.h" + +// 房主头像宽 150 + 光圈 5 +#define ownerWidth (150 + 5) +// 昵称高12,距离头像间距 6 +#define ownerHeight (ownerWidth + 6 + 12) +// 右边 3 个坑位宽40 + 光圈 5 +#define mcWidth (40 + 5) +#define mcHeight (mcWidth + 6 + 12) +// 右 padding 20 +#define paddingH 20 +// 右边坑位的上下间距 +#define marginV2 15 + +@implementation AnchorStageView + +- (NSInteger)countOfMircoView { + return 4; +} + +- (UIView *)microViewForIndex:(NSInteger)index { + UIView * microView = [super microViewForIndex:index]; + if (microView) { + return microView; + } + return [[AnchorMicroView alloc]init]; +} + +/** + * | ◯ | * 房主头像宽 150 + 光圈 5 + * | 20 ◯ ◯ ◯ ◯ 20 | * 左右 padding 20 + * | 15 | * 上下两排间距 15 + * | ◯ ◯ ◯ ◯ | * 右边 3 个坑位宽40 + 光圈 5 + * * 昵称高12,距离头像间距 6 + */ +- (CGRect)rectForViewAtIndex:(NSInteger)index { + if (index == 0) { + return CGRectMake(KScreenWidth / 2 - ownerWidth / 2, (360 - ownerWidth) * 0.5, ownerWidth, ownerHeight); + } + if (index >= 1 && index <= 3) { + CGFloat firstMarginTop = (360 - marginV2 * 2 - mcHeight * 3) * 0.5; + return CGRectMake(KScreenWidth - mcWidth - paddingH, firstMarginTop + (index - 1) * (mcHeight + marginV2), mcWidth, mcHeight); + } + + return [super rectForViewAtIndex:index]; +} + +- (CGFloat)hightForStageView { + return 360; +} + +- (CGPoint)animationPointAtStageViewByUid:(NSString *)uid { + NSInteger index = [self getIndexByUid:uid]; + CGPoint point = CGPointZero; + if (index == 0) { + point = CGPointMake(KScreenWidth / 2, ownerWidth / 2 - 10); + } + + if (index >= 1 && index <= 3) { + CGFloat firstMarginTop = (360 - 15 * 2 - mcHeight * 3) * 0.5; + point = CGPointMake(KScreenWidth - mcWidth * 0.5 - paddingH, firstMarginTop + (index - 1) * mcHeight - 10); + } + + point = [self convertPoint:point toView:nil]; + return point; +} + +- (void)onRoomEntered { + [super onRoomEntered]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self autoUpMicAtIndex:-1]; + }); +} + +- (void)autoUpMicAtIndex:(NSInteger)index { + NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init]; + request.key = [NSString stringWithFormat:@"%zd", index]; + UserInfoModel* userInfo = self.hostDelegate.getUserInfo; + RoomInfoModel* roomInfo = self.hostDelegate.getRoomInfo; + if (roomInfo.uid != [[AccountInfoStorage instance].getUid integerValue]) { + return; + } + NSString* roomId = [NSString stringWithFormat:@"%ld", roomInfo.roomId]; + request.value = [[self userInfoToQueueExt:userInfo] toJSONString]; + request.roomId = roomId; + request.transient = YES; + [[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) { + }]; +} + +/** + * index 处的坑位点击事件 + */ +- (void)didSelectAtIndex:(NSInteger)index { + MicroQueueModel* micModel = [self.getMicroQueue objectForKey:[self indexToPosition:index]]; + UserInfoModel* userInfo = self.hostDelegate.getUserInfo; + RoomInfoModel* roomInfo = self.hostDelegate.getRoomInfo; + NSString* position = [self indexToPosition:index]; + NSString* uid = [NSString stringWithFormat:@"%ld", userInfo.uid]; + NSString* roomId = [NSString stringWithFormat:@"%ld", roomInfo.roomId]; + + // 1. 麦位上有人,弹窗用户资料卡 + NSString * targetUid; + if (roomInfo.leaveMode && [position isEqualToString:@"-1"]) { + targetUid = [NSString stringWithFormat:@"%ld", roomInfo.uid]; + } + if (micModel.userInfo && micModel.userInfo.uid > 0) { + targetUid = [NSString stringWithFormat:@"%ld", micModel.userInfo.uid]; + } + + if (targetUid && targetUid.length > 0) { + XPUserCardInfoModel * model = [[XPUserCardInfoModel alloc] init]; + model.uid = targetUid; + model.position = position; + model.posState = micModel.microState.posState; + model.micState = micModel.microState.micState; + model.nick = userInfo.nick; + model.roomInfo = roomInfo; + model.micQueue = self.getMicroQueue; + model.delegate = self.hostDelegate; + XPUserCardViewController * userCardVC = [[XPUserCardViewController alloc] initWithUser:model]; + [self.hostDelegate.getCurrentNav presentViewController:userCardVC animated:YES completion:nil]; + return; + } + + // 2. 空麦位,上麦逻辑 + NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init]; + request.roomId = roomId; + request.userIds = @[uid]; + [[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray * _Nullable members) { + NIMChatroomMember * member = members.firstObject; + if (!member) return; + // 2.1 房主点击了空麦位 + if (member.type == NIMTeamMemberTypeOwner) { + // 2.1.2 锁麦/解锁 + NSString * lockTitle; + if (roomInfo.roomModeType == RoomModeType_Open_Micro_Mode || roomInfo.roomModeType == RoomModeType_Open_Blind) { + lockTitle = micModel.microState.posState == MicroPosStateType_Free ? @"切换为排麦" : @"切换为自由麦"; + } else { + lockTitle = micModel.microState.posState == MicroPosStateType_Free ? @"锁麦" : @"解锁"; + } + TTActionSheetConfig *lockMic = [TTActionSheetConfig normalTitle:lockTitle clickAction:^{ + NSString * roomUid = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid]; + NSString * state = micModel.microState.posState == MicroPosStateType_Free ? @"1" : @"0"; + NSString * ticket = [[AccountInfoStorage instance] getTicket]; + NSString * uid = [[AccountInfoStorage instance] getUid]; + [Api microLockCompletion:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + + } roomUid:roomUid state:state position:position ticket:ticket uid:uid]; + }]; + + // 2.1.3 闭麦/开麦 + NSString * muteTitle = micModel.microState.micState == MicroMicStateType_Open ? @"闭麦" : @"开麦"; + TTActionSheetConfig *muteMic = [TTActionSheetConfig normalTitle:muteTitle clickAction:^{ + NSString * roomUid = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid]; + NSString * state = micModel.microState.micState == MicroMicStateType_Open ? @"1" : @"0"; + NSString * ticket = [[AccountInfoStorage instance] getTicket]; + NSString * uid = [[AccountInfoStorage instance] getUid]; + [Api microMuteCompletion:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + + } roomUid:roomUid state:state position:position ticket:ticket uid:uid]; + }]; + + // 抱Ta上麦 + TTActionSheetConfig *inviteMic = [TTActionSheetConfig normalTitle:@"抱Ta上麦" clickAction:^{ + XPRoomInviteUserViewController * inviteUserMicVC = [[XPRoomInviteUserViewController alloc] init]; + inviteUserMicVC.roomId = roomId; + inviteUserMicVC.position = position; + inviteUserMicVC.blindDateVipUid = roomInfo.blindDateVipUid; + [self.hostDelegate.getCurrentNav pushViewController:inviteUserMicVC animated:YES]; + }]; + + [TTPopup actionSheetWithItems:@[inviteMic, lockMic, muteMic]]; + } else { + // 2.2 非房主点击了空麦位 + NSString* selfUid = [NSString stringWithFormat:@"%ld", (long)self.hostDelegate.getUserInfo.uid]; + UIView* microView = [self findMicroViewByUid:selfUid]; + if (microView) { + [XCHUDTool showErrorWithMessage:@"你已经在麦上了喔"]; + } else { + [XCHUDTool showErrorWithMessage:@"让主播抱你上麦进行更多互动吧~"]; + [self sendMessageToRoomOwnerWithUserModel:self.hostDelegate.getUserInfo]; + } + } + }]; +} + +- (void)sendMessageToRoomOwnerWithUserModel:(UserInfoModel *)userInfo { + NIMMessage * message = [[NIMMessage alloc] init]; + AttachmentModel * attachMent = [[AttachmentModel alloc] init]; + attachMent.first = Custom_Noti_Header_AnchorRoom_AudienceUpMic; + attachMent.data = [userInfo model2dictionary]; + NIMCustomObject *object = [[NIMCustomObject alloc] init]; + object.attachment = attachMent; + message.messageObject = object; + //构造会话 + NSString * sessionId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId]; + NIMSession *session = [NIMSession session:sessionId type:NIMSessionTypeChatroom]; + [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:nil]; +} + +#pragma mark - private utils function +/** + * 麦位更新扩展字段。 + */ +- (NSDictionary *)userInfoToQueueExt:(UserInfoModel *)userInfo { + MicroExtModel * extModel = [[MicroExtModel alloc] init]; + extModel.gender = userInfo.gender; + extModel.avatar = userInfo.avatar; + extModel.uid = userInfo.uid; + extModel.nick = userInfo.nick; + extModel.headWearUrl = userInfo.headwearEffect.length > 0 ? userInfo.headwearEffect : userInfo.headwearPic; + return [extModel model2dictionary]; +} + +@end diff --git a/xplan-ios/Main/Room/View/StageView/MicroView/Anchor/AnchorMicroView.h b/xplan-ios/Main/Room/View/StageView/MicroView/Anchor/AnchorMicroView.h new file mode 100644 index 00000000..58a0baff --- /dev/null +++ b/xplan-ios/Main/Room/View/StageView/MicroView/Anchor/AnchorMicroView.h @@ -0,0 +1,16 @@ +// +// AnchorMicroView.h +// xplan-ios +// +// Created by GreenLand on 2022/2/14. +// + +#import "MicroView.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface AnchorMicroView : MicroView + +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Room/View/StageView/MicroView/Anchor/AnchorMicroView.m b/xplan-ios/Main/Room/View/StageView/MicroView/Anchor/AnchorMicroView.m new file mode 100644 index 00000000..a9e8d40b --- /dev/null +++ b/xplan-ios/Main/Room/View/StageView/MicroView/Anchor/AnchorMicroView.m @@ -0,0 +1,56 @@ +// +// AnchorMicroView.m +// xplan-ios +// +// Created by GreenLand on 2022/2/14. +// + +#import "AnchorMicroView.h" +///Third +#import + +@implementation AnchorMicroView + +#pragma mark - MicroViewProtocol +- (void)showGiftValueMode:(BOOL)isGiftValue { + self.giftValueView.hidden = YES; +} + +- (void)showLeaveMode:(BOOL)isLeaveMode { +} + +- (void)configMicroView:(MicroQueueModel *)model { + [super configMicroView:model]; + UserInfoModel * userInfo = model.userInfo; + int position = model.microState.position; + if (position != -1 && userInfo == nil) { + self.nickLabel.text = @"号嘉宾"; + } + if (position == 0) { + UIImage *image = [UIImage imageNamed:@"room_game_position_boss"]; + CGSize scaledToSize = CGSizeMake(self.frame.size.width, self.frame.size.width); + UIGraphicsBeginImageContextWithOptions(scaledToSize, false, 0.0); + // 缩小 “1” 点儿,防止默认背景的边缘被裁减。 + [image drawInRect:CGRectMake(1, 1, scaledToSize.width - 2, scaledToSize.height - 2)]; + UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + self.avatarImageView.backgroundColor = [UIColor colorWithPatternImage:newImage]; + } + ///更新离开模式蒙层 + if (userInfo) { + if ([self.subviews containsObject:self.leaveLabel]) { + [self.leaveLabel removeFromSuperview]; + } + } else { + if (![self.subviews containsObject:self.leaveLabel]) { + [self insertSubview:self.leaveLabel belowSubview:self.giftValueView]; + [self.leaveLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.avatarImageView); + }]; + self.leaveLabel.layer.cornerRadius = 150 * 0.5; + self.leaveLabel.layer.masksToBounds = YES; + } + } +} + +@end diff --git a/xplan-ios/Main/Room/View/StageView/MicroView/MicroView.h b/xplan-ios/Main/Room/View/StageView/MicroView/MicroView.h index 05f51785..834b3513 100644 --- a/xplan-ios/Main/Room/View/StageView/MicroView/MicroView.h +++ b/xplan-ios/Main/Room/View/StageView/MicroView/MicroView.h @@ -9,6 +9,9 @@ #import #import "MicroViewProtocol.h" #import "NetImageView.h" +#import "MicroGiftValueView.h" + +@class MicroGiftValueView; NS_ASSUME_NONNULL_BEGIN @interface MicroView : UIView ///头像 @@ -19,6 +22,11 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic,strong, readonly) UILabel *nickLabel; ///头饰 @property (nonatomic,strong, readonly) YYAnimatedImageView *headWearImageView; +///礼物值 +@property (nonatomic,strong, readonly) MicroGiftValueView *giftValueView; +///离开模式 +@property (nonatomic,strong) UILabel *leaveLabel; + @end NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Room/View/StageView/MicroView/MicroView.m b/xplan-ios/Main/Room/View/StageView/MicroView/MicroView.m index e43d31b7..5a51f409 100644 --- a/xplan-ios/Main/Room/View/StageView/MicroView/MicroView.m +++ b/xplan-ios/Main/Room/View/StageView/MicroView/MicroView.m @@ -11,7 +11,6 @@ ///View #import "MicroWaveView.h" -#import "MicroGiftValueView.h" #import "NetImageView.h" #import "XPHtmlUrl.h" @@ -34,8 +33,6 @@ @property (nonatomic,strong) UILabel *nickLabel; ///声波动画 @property (nonatomic,strong) MicroWaveView *animationView; -///离开模式 -@property (nonatomic,strong) UILabel *leaveLabel; ///礼物值 @property (nonatomic,strong) MicroGiftValueView *giftValueView; ///麦序的信息 diff --git a/xplan-ios/Main/Room/View/UserCard/Presenter/XPUserCardPresenter.m b/xplan-ios/Main/Room/View/UserCard/Presenter/XPUserCardPresenter.m index 67ee52da..b8be96bf 100644 --- a/xplan-ios/Main/Room/View/UserCard/Presenter/XPUserCardPresenter.m +++ b/xplan-ios/Main/Room/View/UserCard/Presenter/XPUserCardPresenter.m @@ -193,6 +193,9 @@ if (member.type == NIMTeamMemberTypeOwner || member.type == NIMChatroomMemberTypeManager) { if (userInfo.roomInfo.leaveMode && userInfo.uid.integerValue == userInfo.roomInfo.uid && [userInfo.position isEqualToString:@"-1"]) { [array addObject:muteItem]; + if (userInfo.roomInfo.type != RoomType_Anchor) {//个播房房主自己不能自行下麦 + [array addObject:upDownItem]; + } [array addObject:lockItem]; } else { if (userInfo.position.length > 0) { @@ -228,7 +231,9 @@ [array addObject:muteItem]; [array addObject:upDownItem]; [array addObject:lockItem]; - [array addObject:giftValueItem]; + if (userInfo.roomInfo.type != RoomType_Anchor) {//非个播房显示清除礼物值 + [array addObject:giftValueItem]; + } } } else { [array addObject:upDownItem]; @@ -255,7 +260,9 @@ [array addObject:muteItem]; [array addObject:upDownItem]; [array addObject:lockItem]; - [array addObject:giftValueItem]; + if (userInfo.roomInfo.type != RoomType_Anchor) {//非个播房显示清除礼物值 + [array addObject:giftValueItem]; + } } } else { [array addObject:upDownItem]; diff --git a/xplan-ios/Main/Room/View/XPRoomViewController.m b/xplan-ios/Main/Room/View/XPRoomViewController.m index 00e4b61e..ad7ad7d4 100644 --- a/xplan-ios/Main/Room/View/XPRoomViewController.m +++ b/xplan-ios/Main/Room/View/XPRoomViewController.m @@ -32,6 +32,7 @@ #import "RoomHeaderView.h" #import "SocialStageView.h" #import "DatingStageView.h" +#import "AnchorStageView.h" #import "XPRoomAnimationView.h" #import "XPRoomFunctionContainerView.h" #import "XPArrangeMicViewController.h" @@ -220,7 +221,13 @@ UIKIT_EXTERN NSString * const kRoomMiniNotificationKey; self.stageView = nil; self.stageView = [[SocialStageView alloc] initWithDelegate:self]; } else { - return; + if (self.roomInfo.type == RoomType_Anchor) { + [self.stageView removeFromSuperview]; + self.stageView = nil; + self.stageView = [[AnchorStageView alloc] initWithDelegate:self]; + } else { + return; + } } if (!self.stageView.superview) { [self.view insertSubview:self.stageView aboveSubview:self.roomHeaderView];