From 614a2715a17e5ad868c07bb08af3105011841723 Mon Sep 17 00:00:00 2001 From: fengshuo <963787902@qq.com> Date: Thu, 30 Dec 2021 12:06:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BA=86=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=94=A8=E6=88=B7=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E7=82=B9=E5=87=BB=E5=B1=95=E7=A4=BA=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=8D=A1=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xplan-ios.xcodeproj/project.pbxproj | 6 + .../Room/View/RoomHeaderView/RoomHeaderView.m | 3 +- .../View/Cell/XPRoomOnlineTableViewCell.h | 19 + .../View/Cell/XPRoomOnlineTableViewCell.m | 350 ++++++++++++++++++ .../Setting/View/XPRoomOnLineViewController.h | 6 +- .../Setting/View/XPRoomOnLineViewController.m | 221 ++++++++++- 6 files changed, 580 insertions(+), 25 deletions(-) create mode 100644 xplan-ios/Main/Room/View/Setting/View/Cell/XPRoomOnlineTableViewCell.h create mode 100644 xplan-ios/Main/Room/View/Setting/View/Cell/XPRoomOnlineTableViewCell.m diff --git a/xplan-ios.xcodeproj/project.pbxproj b/xplan-ios.xcodeproj/project.pbxproj index 860531bc..4153a94a 100644 --- a/xplan-ios.xcodeproj/project.pbxproj +++ b/xplan-ios.xcodeproj/project.pbxproj @@ -291,6 +291,7 @@ E896EFB62771D55500AD2CC1 /* FansInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E896EFB52771D55500AD2CC1 /* FansInfoModel.m */; }; E899C68927508F4E00E189E5 /* XPUserCardInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E899C68827508F4E00E189E5 /* XPUserCardInfoModel.m */; }; E899C68C275093B800E189E5 /* XPUserCardMicroItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E899C68B275093B800E189E5 /* XPUserCardMicroItemModel.m */; }; + E89BD7D4277D471100E31B19 /* XPRoomOnlineTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E89BD7D3277D471100E31B19 /* XPRoomOnlineTableViewCell.m */; }; E89D60BA271D643A001F8895 /* Api+Room.m in Sources */ = {isa = PBXBuildFile; fileRef = E89D60B9271D643A001F8895 /* Api+Room.m */; }; E89D60BD271D647A001F8895 /* XPRoomPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = E89D60BC271D647A001F8895 /* XPRoomPresenter.m */; }; E89D60C1271D64B9001F8895 /* RoomInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E89D60C0271D64B9001F8895 /* RoomInfoModel.m */; }; @@ -981,6 +982,8 @@ E899C68827508F4E00E189E5 /* XPUserCardInfoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPUserCardInfoModel.m; sourceTree = ""; }; E899C68A275093B700E189E5 /* XPUserCardMicroItemModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPUserCardMicroItemModel.h; sourceTree = ""; }; E899C68B275093B800E189E5 /* XPUserCardMicroItemModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPUserCardMicroItemModel.m; sourceTree = ""; }; + E89BD7D2277D471100E31B19 /* XPRoomOnlineTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPRoomOnlineTableViewCell.h; sourceTree = ""; }; + E89BD7D3277D471100E31B19 /* XPRoomOnlineTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPRoomOnlineTableViewCell.m; sourceTree = ""; }; E89D60B8271D643A001F8895 /* Api+Room.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Api+Room.h"; sourceTree = ""; }; E89D60B9271D643A001F8895 /* Api+Room.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "Api+Room.m"; sourceTree = ""; }; E89D60BB271D647A001F8895 /* XPRoomPresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPRoomPresenter.h; sourceTree = ""; }; @@ -2379,6 +2382,8 @@ E84BF7D9277C72AC00EF8877 /* XPRoomRoleTableViewCell.m */, E84BF7DB277C765400EF8877 /* XPRoomRoleEmptyTableViewCell.h */, E84BF7DC277C765400EF8877 /* XPRoomRoleEmptyTableViewCell.m */, + E89BD7D2277D471100E31B19 /* XPRoomOnlineTableViewCell.h */, + E89BD7D3277D471100E31B19 /* XPRoomOnlineTableViewCell.m */, ); path = Cell; sourceTree = ""; @@ -3927,6 +3932,7 @@ E8AC721626F46B06007D6E91 /* XPMineSettingTableViewCell.m in Sources */, 18EE3FDF2750C1F700A452BF /* SessionListCell.m in Sources */, E80487652717DDD9008595F2 /* XPRoomMenuItem.m in Sources */, + E89BD7D4277D471100E31B19 /* XPRoomOnlineTableViewCell.m in Sources */, E8412F9627795E34006E1101 /* XPRoomInviteFansView.m in Sources */, 189DD75026E21D9000AB55B1 /* GCDHelper.m in Sources */, E82D5C76276AEB5100858D6D /* NameplateModel.m in Sources */, diff --git a/xplan-ios/Main/Room/View/RoomHeaderView/RoomHeaderView.m b/xplan-ios/Main/Room/View/RoomHeaderView/RoomHeaderView.m index 8afcb2a2..57e1205c 100644 --- a/xplan-ios/Main/Room/View/RoomHeaderView/RoomHeaderView.m +++ b/xplan-ios/Main/Room/View/RoomHeaderView/RoomHeaderView.m @@ -101,8 +101,7 @@ } - (void)onlineTapRecognizer { - XPRoomOnLineViewController * onlineVC = [[XPRoomOnLineViewController alloc] init]; - onlineVC.roomId = [NSString stringWithFormat:@"%ld",self.hostDelegate.getRoomInfo.roomId]; + XPRoomOnLineViewController * onlineVC = [[XPRoomOnLineViewController alloc] initWithDelegate:self.hostDelegate]; [self.hostDelegate.getCurrentNav pushViewController:onlineVC animated:YES]; } diff --git a/xplan-ios/Main/Room/View/Setting/View/Cell/XPRoomOnlineTableViewCell.h b/xplan-ios/Main/Room/View/Setting/View/Cell/XPRoomOnlineTableViewCell.h new file mode 100644 index 00000000..b3e34185 --- /dev/null +++ b/xplan-ios/Main/Room/View/Setting/View/Cell/XPRoomOnlineTableViewCell.h @@ -0,0 +1,19 @@ +// +// XPRoomOnlineTableViewCell.h +// xplan-ios +// +// Created by 冯硕 on 2021/12/30. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@class NIMChatroomMember; +@interface XPRoomOnlineTableViewCell : UITableViewCell +///云信用户实体 +@property (strong, nonatomic) NIMChatroomMember *member; +///是否在麦序上 +@property (nonatomic,assign) BOOL isOnMicro; +@end + +NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Room/View/Setting/View/Cell/XPRoomOnlineTableViewCell.m b/xplan-ios/Main/Room/View/Setting/View/Cell/XPRoomOnlineTableViewCell.m new file mode 100644 index 00000000..55c00c5a --- /dev/null +++ b/xplan-ios/Main/Room/View/Setting/View/Cell/XPRoomOnlineTableViewCell.m @@ -0,0 +1,350 @@ +// +// XPRoomOnlineTableViewCell.m +// xplan-ios +// +// Created by 冯硕 on 2021/12/30. +// + +#import "XPRoomOnlineTableViewCell.h" +///Third +#import +#import +///Tool +#import "NetImageView.h" +#import "ThemeColor.h" +#import "UIImage+Utils.h" +#import "XPMessageRemoteExtModel.h" + +@interface XPRoomOnlineTableViewCell () +///显示头像 +@property (nonatomic,strong) NetImageView *avatarImageView; +///性别 +@property (nonatomic,strong) UIImageView *sexImageView; +///姓名 和 等级 总的容器 +@property (nonatomic,strong) UIStackView *stackView; +///姓名的容器 +@property (nonatomic,strong) UIStackView *nickStackView; +///显示姓名 +@property (nonatomic,strong) UILabel *nickLabel; +///魅力等级 等级 铭牌 +@property (nonatomic,strong) UIStackView *tagStackView; +///角色的 +@property (nonatomic,strong) UIButton *roleButton; +///美丽等级 +@property (nonatomic,strong) NetImageView *charmImageView; +///等级 +@property (nonatomic,strong) NetImageView *experImageView; +///铭牌的容器 +@property (nonatomic,strong) UIView * namePlateView; +///铭牌图片 +@property (nonatomic,strong) NetImageView *nameplateImageView; +///铭牌文字 +@property (nonatomic,strong) UILabel *nameplateLabel; +///分割线 +@property (nonatomic,strong) UIView * lineView; +///在麦上显示标签 +@property (strong, nonatomic) UILabel *onMicroStatusLabel; +@end + +@implementation XPRoomOnlineTableViewCell + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; +} + +#pragma mark - Private Method +- (void)initSubViews { + self.backgroundColor = [UIColor clearColor]; + self.selectionStyle = UITableViewCellSelectionStyleNone; + [self.contentView addSubview:self.avatarImageView]; + [self.contentView addSubview:self.stackView]; + [self.contentView addSubview:self.lineView]; + [self.contentView addSubview:self.onMicroStatusLabel]; + + [self.stackView addArrangedSubview:self.nickStackView]; + [self.stackView addArrangedSubview:self.tagStackView]; + + [self.nickStackView addArrangedSubview:self.nickLabel]; + [self.nickStackView addArrangedSubview:self.sexImageView]; + + [self.tagStackView addArrangedSubview:self.roleButton]; + [self.tagStackView addArrangedSubview:self.experImageView]; + [self.tagStackView addArrangedSubview:self.charmImageView]; + [self.tagStackView addArrangedSubview:self.namePlateView]; + + ///铭牌 + [self.namePlateView addSubview:self.nameplateImageView]; + [self.namePlateView addSubview:self.nameplateLabel]; +} + +- (void)initSubViewConstraints { + [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.contentView).offset(15); + make.width.height.mas_equalTo(40); + make.centerY.mas_equalTo(self.contentView.mas_centerY); + }]; + + [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self); + make.left.mas_equalTo(self.avatarImageView.mas_right).offset(10); + }]; + + [self.tagStackView mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(25); + }]; + + [self.roleButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(38, 15)); + }]; + + [self.experImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(25); + }]; + + [self.charmImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(25); + }]; + + [self.namePlateView mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(25); + make.width.mas_equalTo(self.nameplateImageView.mas_width); + }]; + + + [self.nameplateImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(25); + make.width.mas_equalTo(60); + make.left.top.mas_equalTo(self.namePlateView); + }]; + + [self.nameplateLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.bottom.mas_equalTo(self.nameplateImageView); + make.right.mas_equalTo(self.namePlateView).offset(-2); + }]; + + [self.lineView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.mas_equalTo(self.nickLabel); + make.right.mas_equalTo(self.contentView).offset(-15); + make.bottom.mas_equalTo(self.contentView); + make.height.mas_equalTo(0.5); + }]; + + [self.onMicroStatusLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self.contentView); + make.right.mas_equalTo(-15); + make.width.mas_equalTo(32); + make.height.mas_equalTo(14); + }]; +} + + +#pragma mark - Getters And Setters +- (void)setMember:(NIMChatroomMember *)member { + _member = member; + if (_member) { + self.avatarImageView.imageUrl = _member.roomAvatar; + self.nickLabel.text = _member.roomNickname; + NIMUser *user = [[NIMSDK sharedSDK].userManager userInfo:_member.userId]; + self.sexImageView.image = user.userInfo.gender == NIMUserGenderFemale ? [UIImage imageNamed:@"common_female"] : [UIImage imageNamed:@"common_male"]; + NSDictionary * extDic = [member.roomExt toJSONObject]; + if (extDic.allKeys.count > 0 || (member.type == NIMTeamMemberTypeOwner || member.type == NIMChatroomMemberTypeManager)) { + self.tagStackView.hidden = NO; + XPMessageRemoteExtModel * userInfo = [XPMessageRemoteExtModel modelWithDictionary:[extDic objectForKey:member.userId]]; + + if (userInfo.experUrl) { + self.experImageView.imageUrl = userInfo.experUrl; + } + self.experImageView.hidden = userInfo.experUrl.length <= 0; + + if (userInfo.charmUrl) { + self.charmImageView.imageUrl = userInfo.charmUrl; + } + self.charmImageView.hidden = userInfo.charmUrl.length <= 0; + + if (userInfo.inRoomNameplatePic.length>0 && userInfo.inRoomNameplateWord.length>0) { + self.nameplateImageView.imageUrl = userInfo.inRoomNameplatePic; + self.nameplateLabel.text = userInfo.inRoomNameplateWord; + self.namePlateView.hidden = NO; + } else { + self.namePlateView.hidden = YES; + } + + if (_member.type == NIMTeamMemberTypeOwner) { + self.roleButton.hidden = NO; + [self.roleButton setBackgroundColor:[ThemeColor appEmphasizeColor2]]; + [self.roleButton setTitle:@"房主" forState:UIControlStateNormal]; + } else if(_member.type == NIMChatroomMemberTypeManager) { + self.roleButton.hidden = NO; + [self.roleButton setBackgroundColor:[ThemeColor appEmphasizeColor]]; + [self.roleButton setTitle:@"管理员" forState:UIControlStateNormal]; + } else { + self.roleButton.hidden = YES; + } + } else { + self.tagStackView.hidden = YES; + } + + } +} + +- (void)setIsOnMicro:(BOOL)isOnMicro { + self.onMicroStatusLabel.hidden = !isOnMicro; +} + +- (NetImageView *)avatarImageView { + if (!_avatarImageView) { + NetImageConfig * config = [[NetImageConfig alloc]init]; + config.imageType = ImageTypeUserIcon; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + _avatarImageView = [[NetImageView alloc] initWithConfig:config]; + _avatarImageView.layer.masksToBounds = YES; + _avatarImageView.layer.cornerRadius = 40/2; + _avatarImageView.layer.borderColor = [ThemeColor appMainColor].CGColor; + } + return _avatarImageView; +} + +- (UIImageView *)sexImageView { + if (!_sexImageView) { + _sexImageView = [[UIImageView alloc] init]; + _sexImageView.userInteractionEnabled = YES; + } + return _sexImageView; +} + +- (UILabel *)nickLabel { + if (!_nickLabel) { + _nickLabel = [[UILabel alloc] init]; + _nickLabel.font = [UIFont systemFontOfSize:15]; + _nickLabel.textColor = [UIColor whiteColor]; + } + return _nickLabel; +} + +- (UIStackView *)stackView { + if (!_stackView) { + _stackView = [[UIStackView alloc] init]; + _stackView.axis = UILayoutConstraintAxisVertical; + _stackView.distribution = UIStackViewDistributionFillProportionally; + _stackView.alignment = UIStackViewAlignmentLeading; + _stackView.spacing = 5; + } + return _stackView; +} + +- (UIStackView *)nickStackView { + if (!_nickStackView) { + _nickStackView = [[UIStackView alloc] init]; + _nickStackView.axis = UILayoutConstraintAxisHorizontal; + _nickStackView.distribution = UIStackViewDistributionFill; + _nickStackView.alignment = UIStackViewAlignmentCenter; + _nickStackView.spacing = 3; + } + return _nickStackView; +} + +- (UIStackView *)tagStackView { + if (!_tagStackView) { + _tagStackView = [[UIStackView alloc] init]; + _tagStackView.axis = UILayoutConstraintAxisHorizontal; + _tagStackView.distribution = UIStackViewDistributionFill; + _tagStackView.alignment = UIStackViewAlignmentCenter; + _tagStackView.spacing = 2; + } + return _tagStackView; +} +- (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 *)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; +} + +- (UIView *)namePlateView { + if (!_namePlateView) { + _namePlateView = [[UIView alloc] init]; + _namePlateView.backgroundColor = [UIColor clearColor]; + _namePlateView.hidden = YES; + } + return _namePlateView; +} + +- (NetImageView *)nameplateImageView { + if (!_nameplateImageView) { + NetImageConfig * config = [[NetImageConfig alloc] init]; + config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; + config.imageType = ImageTypeUserCardLevel; + _nameplateImageView = [[NetImageView alloc] initWithConfig:config]; + _nameplateImageView.userInteractionEnabled = YES; + _nameplateImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _nameplateImageView; +} + +- (UILabel *)nameplateLabel { + if (!_nameplateLabel) { + _nameplateLabel = [[UILabel alloc] init]; + _nameplateLabel.font = [UIFont systemFontOfSize:10]; + _nameplateLabel.textAlignment = NSTextAlignmentCenter; + _nameplateLabel.textColor = [UIColor whiteColor]; + } + return _nameplateLabel; +} + +- (UIView *)lineView { + if (!_lineView) { + _lineView = [[UIView alloc] init]; + _lineView.backgroundColor = [UIColor colorWithWhite:1 alpha:0.1]; + } + return _lineView; +} + +- (UIButton *)roleButton { + if (!_roleButton) { + _roleButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_roleButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + _roleButton.titleLabel.font = [UIFont systemFontOfSize:10]; + _roleButton.layer.masksToBounds = YES; + _roleButton.layer.cornerRadius = 15 / 2; + } + return _roleButton; +} + +- (UILabel *)onMicroStatusLabel { + if (!_onMicroStatusLabel) { + _onMicroStatusLabel = [[UILabel alloc] init]; + _onMicroStatusLabel.text = @"上麦"; + _onMicroStatusLabel.textColor = UIColor.whiteColor; + _onMicroStatusLabel.font = [UIFont systemFontOfSize:10]; + _onMicroStatusLabel.textAlignment = NSTextAlignmentCenter; + _onMicroStatusLabel.layer.cornerRadius = 7; + _onMicroStatusLabel.layer.masksToBounds = YES; + _onMicroStatusLabel.backgroundColor = [ThemeColor appEmphasizeColor]; + } + return _onMicroStatusLabel; +} + +@end diff --git a/xplan-ios/Main/Room/View/Setting/View/XPRoomOnLineViewController.h b/xplan-ios/Main/Room/View/Setting/View/XPRoomOnLineViewController.h index 40f12644..60b4dee6 100644 --- a/xplan-ios/Main/Room/View/Setting/View/XPRoomOnLineViewController.h +++ b/xplan-ios/Main/Room/View/Setting/View/XPRoomOnLineViewController.h @@ -6,12 +6,12 @@ // #import "BaseViewController.h" - +#import "RoomHostDelegate.h" NS_ASSUME_NONNULL_BEGIN @interface XPRoomOnLineViewController : BaseViewController -///房间的id -@property (nonatomic,copy) NSString *roomId; + +- (instancetype)initWithDelegate:(id)delegate; @end NS_ASSUME_NONNULL_END diff --git a/xplan-ios/Main/Room/View/Setting/View/XPRoomOnLineViewController.m b/xplan-ios/Main/Room/View/Setting/View/XPRoomOnLineViewController.m index 3eafb1f9..3bd9a9b8 100644 --- a/xplan-ios/Main/Room/View/Setting/View/XPRoomOnLineViewController.m +++ b/xplan-ios/Main/Room/View/Setting/View/XPRoomOnLineViewController.m @@ -14,10 +14,27 @@ ///Tool #import "ThemeColor.h" #import "XPMacro.h" -#import "XPRoomRoleTableViewCell.h" +#import "UIButton+EnlargeTouchArea.h" +///Model +#import "UserInfoModel.h" +#import "MicroQueueModel.h" +#import "RoomInfoModel.h" +#import "XPUserCardInfoModel.h" +///View +#import "XPRoomOnlineTableViewCell.h" #import "XPRoomRoleEmptyTableViewCell.h" +///VC +#import "XPUserCardViewController.h" -@interface XPRoomOnLineViewController () +@interface XPRoomOnLineViewController () +///导航栏 +@property (nonatomic,strong) UIView * navView; +///返回按钮 +@property (nonatomic,strong) UIButton *backButton; +///显示标题 +@property (nonatomic,strong) UILabel *titleLabel; +///背景图 +@property (nonatomic,strong) UIImageView *backImageView; ///总的数据 @property (nonatomic,strong) NSMutableArray *originArray; ///需要显示的数据 @@ -28,12 +45,38 @@ @property (nonatomic,strong) NIMChatroomMember *lastMember; ///临时成员最后一个 @property (nonatomic,strong) NIMChatroomMember *tmpLastMember; +///host +@property (nonatomic,weak) idhostDelegate; +///房间的id +@property (nonatomic,copy) NSString *roomId; @end @implementation XPRoomOnLineViewController +- (void)dealloc { + [[NIMSDK sharedSDK].chatManager removeDelegate:self]; +} + +- (instancetype)initWithDelegate:(id)delegate { + if (self = [super init]) { + self.hostDelegate = delegate; + self.roomId= [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId]; + } + return self; +} + +- (BOOL)isHiddenNavBar { + return YES; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; +} - (void)viewDidLoad { [super viewDidLoad]; + //监听云信消息 + [[NIMSDK sharedSDK].chatManager addDelegate:self]; [self initHeaderAndFooterRrfresh]; [self initSubViews]; [self initSubViewConstraints]; @@ -41,13 +84,39 @@ #pragma mark - Private Method - (void)initSubViews { + [self.view addSubview:self.backImageView]; [self.view addSubview:self.tableView]; + [self.view addSubview:self.navView]; + + [self.navView addSubview:self.backButton]; + [self.navView addSubview:self.titleLabel]; } - (void)initSubViewConstraints { - [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { + [self.backImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.view); }]; + + [self.navView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.top.mas_equalTo(self.view); + make.height.mas_equalTo(kNavigationHeight); + }]; + + [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.mas_equalTo(self.view); + make.top.mas_equalTo(self.navView.mas_bottom); + }]; + + [self.backButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(22, 22)); + make.left.mas_equalTo(self.navView).offset(8); + make.centerY.mas_equalTo(self.titleLabel); + }]; + + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.navView); + make.centerY.equalTo(self.navView.mas_bottom).mas_offset(-22); + }]; } - (void)initHeaderAndFooterRrfresh { @@ -122,8 +191,6 @@ request.lastMember = self.lastMember; request.limit = 200; [[NIMSDK sharedSDK].chatroomManager fetchChatroomMembers:request completion:^(NSError * _Nullable error, NSArray * _Nullable members) { - [self.tableView.mj_header endRefreshing]; - [self.tableView.mj_footer endRefreshing]; if (error == nil) { if (members.count > 0) { self.lastMember = members.lastObject; @@ -177,6 +244,54 @@ }]; } +///判断是否在麦上 +- (BOOL)memberIsOnMicro:(NSString *)userId{ + NSArray *chatRoomMicSequences = [self.hostDelegate.getMicroQueue allValues] ; + if (chatRoomMicSequences != nil && chatRoomMicSequences.count > 0) { + for (int i = 0; i < chatRoomMicSequences.count; i ++) { + MicroQueueModel *chatRoomMicSequence = chatRoomMicSequences[i]; + if (chatRoomMicSequence.userInfo.uid == userId.integerValue) { + return YES; + } + } + } + return NO; +} + +#pragma mark - NIMChatManagerDelegate +- (void)onRecvMessages:(NSArray *)messages { + for (NIMMessage * message in messages) { + // 非房间内消息不处理 + if (message.session.sessionType != NIMSessionTypeChatroom) { + continue; + } + + // 非本房间不处理 + if (![message.session.sessionId isEqualToString:self.roomId]) { + continue; + } + if (message.messageType == NIMMessageTypeNotification) { + NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject; + NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content; + switch (content.eventType) { + case NIMChatroomEventTypeEnter: + case NIMChatroomEventTypeExit: + case NIMChatroomEventTypeAddManager: + case NIMChatroomEventTypeRemoveManager: + case NIMChatroomEventTypeAddBlack: + case NIMChatroomEventTypeRemoveBlack: + case NIMChatroomEventTypeQueueChange: + case NIMChatroomEventTypeKicked: + [self headerRefresh]; + break; + default: + break; + + + } + } + } +} #pragma mark - UITableViewDelegate And UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { @@ -185,17 +300,13 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.datasource.count > 0) { - XPRoomRoleTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPRoomRoleTableViewCell class])]; + XPRoomOnlineTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPRoomOnlineTableViewCell class])]; if (cell == nil) { - cell = [[XPRoomRoleTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPRoomRoleTableViewCell class])]; - } - cell.delegate = self; - cell.member = [self.datasource objectAtIndex:indexPath.row]; - if (indexPath.row == (self.datasource.count -1)) { - cell.lineView.hidden = YES; - } else { - cell.lineView.hidden = NO; + cell = [[XPRoomOnlineTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPRoomOnlineTableViewCell class])]; } + NIMChatroomMember * member = [self.datasource objectAtIndex:indexPath.row]; + cell.member = member; + cell.isOnMicro = [self memberIsOnMicro:member.userId]; return cell; } @@ -204,22 +315,50 @@ cell = [[XPRoomRoleEmptyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPRoomRoleEmptyTableViewCell class])]; } cell.titleLabel.text = @"暂没有房间成员在线"; + cell.backgroundColor = [UIColor clearColor]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.datasource.count > 0) { - return 55; + return 60; } - return KScreenHeight - kNavigationHeight; } -#pragma mark - XPRoomRoleTableViewCellDelegate -- (void)xPRoomRoleTableViewCell:(NSString *)view didClickMember:(NIMChatroomMember *)member { - +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + if (self.datasource.count > 0) { + NIMChatroomMember * member = [self.datasource objectAtIndex:indexPath.row]; + RoomInfoModel * roomInfo = self.hostDelegate.getRoomInfo; + NSString * targetUid = member.userId; + XPUserCardInfoModel * model = [[XPUserCardInfoModel alloc] init]; + [[self.hostDelegate.getMicroQueue allValues] enumerateObjectsUsingBlock:^(MicroQueueModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if (targetUid.integerValue == obj.userInfo.uid) { + model.position = [NSString stringWithFormat:@"%d", obj.microState.position]; + model.posState = (UserCardMicroPosStateType)obj.microState.posState; + model.micState = (UserCardMicroMicStateType)obj.microState.micState; + *stop = YES; + } + }]; + model.uid = targetUid; + model.roomId = [NSString stringWithFormat:@"%ld", roomInfo.roomId]; + model.leaveMode = roomInfo.leaveMode; + model.showGiftValue = roomInfo.showGiftValue; + model.avatar = roomInfo.avatar; + model.roomUid = [NSString stringWithFormat:@"%ld", roomInfo.uid]; + model.nick = member.roomNickname; + model.delegate = self.hostDelegate; + XPUserCardViewController * userCardVC = [[XPUserCardViewController alloc] initWithUser:model]; + [self.navigationController presentViewController:userCardVC animated:YES completion:nil]; + } + } +#pragma mark - Event Response +- (void)backButtonAction:(UIButton *)sender { + [self.navigationController popViewControllerAnimated:YES]; +} #pragma mark - Getters And Setters - (UITableView *)tableView { @@ -234,12 +373,54 @@ if (@available(iOS 11.0, *)) { _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } - [_tableView registerClass:[XPRoomRoleTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPRoomRoleTableViewCell class])]; + [_tableView registerClass:[XPRoomOnlineTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPRoomOnlineTableViewCell class])]; [_tableView registerClass:[XPRoomRoleEmptyTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPRoomRoleEmptyTableViewCell class])]; } return _tableView; } +- (UIButton *)backButton { + if (!_backButton) { + _backButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_backButton setImage:[UIImage imageNamed:@"home_search_white_back"] forState:UIControlStateNormal]; + [_backButton addTarget:self action:@selector(backButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + [_backButton setEnlargeEdgeWithTop:10 right:10 bottom:10 left:10]; + } + return _backButton; +} + +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [[UILabel alloc] init]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + _titleLabel.font = [UIFont systemFontOfSize:15]; + _titleLabel.text = @"在线列表"; + _titleLabel.textColor = [UIColor whiteColor]; + } + return _titleLabel; +} + +- (UIView *)navView { + if (!_navView) { + _navView = [[UIView alloc] init]; + _navView.backgroundColor = [UIColor clearColor]; + } + return _navView; +} + + +- (UIImageView *)backImageView { + if (!_backImageView) { + _backImageView = [[UIImageView alloc] init]; + _backImageView.userInteractionEnabled = YES; + _backImageView.layer.masksToBounds = YES; + _backImageView.contentMode = UIViewContentModeScaleAspectFill; + _backImageView.image = [UIImage imageNamed:@"room_background"]; + } + return _backImageView; +} + + - (NSMutableArray *)datasource { if (!_datasource) { _datasource = [NSMutableArray array];