// // QXRoomRankSubView.m // QXLive // // Created by 启星 on 2025/6/9. // #import "QXRoomRankSubView.h" #import "QXBlackListCell.h" #import "QXMineNetwork.h" @interface QXRoomRankSubView() @property (nonatomic,strong)UIView *topBgView; @property (nonatomic,strong)UIButton *hourBtn; @property (nonatomic,strong)UIButton *dayBtn; @property (nonatomic,strong)UIButton *weekBtn; @property (nonatomic,strong)UIButton *selectedBtn; @property (nonatomic,strong)UIView *tableHeaderView; @property (nonatomic,strong)QXRoomRankTopThreeView *firstView; @property (nonatomic,strong)QXRoomRankTopThreeView *secondView; @property (nonatomic,strong)QXRoomRankTopThreeView *thirdView; @property (nonatomic,strong)UITableView *tableView; @property (nonatomic,strong)NSMutableArray *dataArray; @property (nonatomic,strong)NSMutableArray *topArray; @property (nonatomic,assign)NSInteger page; @end @implementation QXRoomRankSubView -(UIView *)listView{ return self; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self initSubviews]; } return self; } -(void)initSubviews{ self.page = 1; self.topBgView = [[UIView alloc] initWithFrame:CGRectMake(16, 8, self.width-32, 40)]; self.topBgView.backgroundColor = RGB16(0x2B2482); [self.topBgView addRoundedCornersWithRadius:20]; [self addSubview:self.topBgView]; self.hourBtn = [[UIButton alloc] init]; [self.hourBtn setTitle:QXText(@"小时榜") forState:(UIControlStateNormal)]; [self.hourBtn setBackgroundImage:[UIImage imageWithColor:[UIColor clearColor]] forState:(UIControlStateNormal)]; [self.hourBtn setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor]] forState:(UIControlStateSelected)]; [self.hourBtn setTitleColor:RGB16(0xACA3ED) forState:(UIControlStateNormal)]; [self.hourBtn setTitleColor:QXConfig.textColor forState:(UIControlStateSelected)]; [self.hourBtn addRoundedCornersWithRadius:15]; self.hourBtn.titleLabel.font = [UIFont boldSystemFontOfSize:14]; [self.hourBtn addTarget:self action:@selector(typeAction:) forControlEvents:(UIControlEventTouchUpInside)]; [self.topBgView addSubview:self.hourBtn]; self.dayBtn = [[UIButton alloc] init]; [self.dayBtn setTitle:QXText(@"日榜") forState:(UIControlStateNormal)]; [self.dayBtn setBackgroundImage:[UIImage imageWithColor:[UIColor clearColor]] forState:(UIControlStateNormal)]; [self.dayBtn setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor]] forState:(UIControlStateSelected)]; [self.dayBtn setTitleColor:RGB16(0xACA3ED) forState:(UIControlStateNormal)]; [self.dayBtn setTitleColor:QXConfig.textColor forState:(UIControlStateSelected)]; [self.dayBtn addRoundedCornersWithRadius:15]; self.dayBtn.titleLabel.font = [UIFont boldSystemFontOfSize:14]; [self.dayBtn addTarget:self action:@selector(typeAction:) forControlEvents:(UIControlEventTouchUpInside)]; [self.topBgView addSubview:self.dayBtn]; self.weekBtn = [[UIButton alloc] init]; [self.weekBtn setTitle:QXText(@"周榜") forState:(UIControlStateNormal)]; [self.weekBtn setBackgroundImage:[UIImage imageWithColor:[UIColor clearColor]] forState:(UIControlStateNormal)]; [self.weekBtn setBackgroundImage:[UIImage imageWithColor:[UIColor whiteColor]] forState:(UIControlStateSelected)]; [self.weekBtn setTitleColor:RGB16(0xACA3ED) forState:(UIControlStateNormal)]; [self.weekBtn setTitleColor:QXConfig.textColor forState:(UIControlStateSelected)]; [self.weekBtn addRoundedCornersWithRadius:15]; self.weekBtn.titleLabel.font = [UIFont boldSystemFontOfSize:14]; [self.weekBtn addTarget:self action:@selector(typeAction:) forControlEvents:(UIControlEventTouchUpInside)]; [self.topBgView addSubview:self.weekBtn]; CGFloat btnWidth = ScaleWidth(72); [self.dayBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self.topBgView); make.height.mas_equalTo(30); make.width.mas_equalTo(btnWidth); make.centerY.equalTo(self.topBgView); }]; [self.hourBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(self.dayBtn.mas_left).offset(-16); make.height.mas_equalTo(30); make.width.mas_equalTo(btnWidth); make.centerY.equalTo(self.topBgView); }]; [self.weekBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.dayBtn.mas_right).offset(16); make.height.mas_equalTo(30); make.width.mas_equalTo(btnWidth); make.centerY.equalTo(self.topBgView); }]; self.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, self.topBgView.bottom+38, self.width, 220)]; CGFloat itemWidth = (self.width-36)/3; self.secondView = [[QXRoomRankTopThreeView alloc] initWithFrame:CGRectMake(18, 50, itemWidth, 135)]; self.secondView.number = 2; self.secondView.delegate = self; [self.tableHeaderView addSubview:self.secondView]; self.firstView = [[QXRoomRankTopThreeView alloc] initWithFrame:CGRectMake(self.secondView.right, 0, itemWidth, 161)]; self.firstView.number = 1; self.firstView.delegate = self; [self.tableHeaderView addSubview:self.firstView]; self.thirdView = [[QXRoomRankTopThreeView alloc] initWithFrame:CGRectMake(self.firstView.right, 50, itemWidth, 135)]; self.thirdView.number = 3; self.thirdView.delegate = self; [self.tableHeaderView addSubview:self.thirdView]; [self addSubview:self.tableHeaderView]; self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, self.tableHeaderView.bottom, self.width, self.height-self.tableHeaderView.bottom) style:(UITableViewStylePlain)]; self.tableView.delegate = self; self.tableView.dataSource = self; self.tableView.backgroundColor = [UIColor clearColor]; self.tableView.rowHeight = 60; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; MJWeakSelf self.tableView.mj_footer = [MJRefreshBackStateFooter footerWithRefreshingBlock:^{ weakSelf.page++; [weakSelf getRankList]; }]; self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ weakSelf.page = 1; [weakSelf getRankList]; }]; [self addSubview:self.tableView]; // self.tableView.tableHeaderView = self.tableHeaderView; self.hourBtn.selected = YES; self.selectedBtn = self.hourBtn; } -(void)setRoomId:(NSString *)roomId{ _roomId = roomId; self.page = 1; [self getRankList]; } -(void)getRankList{ NSString *time_type = @"1"; if (self.selectedBtn == self.hourBtn) { time_type = @"1"; }else if(self.selectedBtn == self.dayBtn){ time_type = @"2"; }else if(self.selectedBtn == self.weekBtn){ time_type = @"3"; } __weak typeof(self) weakSelf = self; [QXMineNetwork roomRankListWithRoomId:self.roomId type:self.type time_type:time_type page:self.page successBlock:^(NSArray * _Nonnull list) { __strong typeof(weakSelf) strongSelf = weakSelf; if (!strongSelf) { NSLog(@"⚠️ self has been deallocated, skipping hide operation"); return; } if (strongSelf.page == 1) { strongSelf.firstView.md = nil; strongSelf.secondView.md = nil; strongSelf.thirdView.md = nil; [strongSelf.dataArray removeAllObjects]; [strongSelf.topArray removeAllObjects]; for (int i = 0 ; i < list.count; i++) { QXRoomOnlineList*md = list[i]; if (i == 0) { // [weakSelf.topArray addObject:md]; strongSelf.firstView.md = md; }else if (i == 1) { strongSelf.secondView.md = md; }else if (i == 2) { strongSelf.thirdView.md = md; }else{ [strongSelf.dataArray addObject:md]; } } }else{ [strongSelf.dataArray addObjectsFromArray:list]; } [strongSelf.tableView reloadData]; if (list.count == 0) { strongSelf.tableView.mj_footer.state = MJRefreshStateNoMoreData; }else{ [strongSelf.tableView.mj_footer endRefreshing]; } [strongSelf.tableView.mj_header endRefreshing]; } failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) { dispatch_async(dispatch_get_main_queue(), ^{ __strong typeof(weakSelf) strongSelf = weakSelf; if (strongSelf) { [strongSelf.tableView.mj_header endRefreshing]; [strongSelf.tableView.mj_footer endRefreshing]; } }); }]; } -(void)previewUserInfoWithUserId:(NSString *)userId{ if (self.delegate && [self.delegate respondsToSelector:@selector(previewUserInfoWithUserId:)]) { [self.delegate previewUserInfoWithUserId:userId]; } } -(void)typeAction:(UIButton*)sender{ self.selectedBtn.selected = !self.selectedBtn.selected; sender.selected = !sender.selected; self.selectedBtn = sender; [self getRankList]; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.dataArray.count; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ QXBlackListCell *cell = [QXBlackListCell cellWithTableView:tableView]; cell.cellType = QXBlackListCellTypeRank; cell.backgroundColor = [UIColor clearColor]; cell.titleLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row+4]; cell.isNoIcon = YES; cell.rankModel = self.dataArray[indexPath.row]; return cell; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ QXRoomOnlineList *model = self.dataArray[indexPath.row]; if (self.delegate && [self.delegate respondsToSelector:@selector(previewUserInfoWithUserId:)]) { [self.delegate previewUserInfoWithUserId:model.user_id]; } } -(NSMutableArray *)dataArray{ if (!_dataArray) { _dataArray = [NSMutableArray array]; } return _dataArray; } -(NSMutableArray *)topArray{ if (!_topArray) { _topArray = [NSMutableArray array]; } return _topArray; } @end @implementation QXRoomRankTopThreeView - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self initSubviews]; } return self; } -(void)setNumber:(NSInteger)number{ _number = number; if (number == 1) { self.borderImageView.image = [UIImage imageNamed:@"room_rank_first"]; }else if(number == 2){ self.borderImageView.image = [UIImage imageNamed:@"room_rank_second"]; [self.headerImageView mas_remakeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self); make.top.equalTo(self).offset(10); make.size.mas_equalTo(CGSizeMake(50, 50)); }]; [self.borderImageView mas_remakeConstraints:^(MASConstraintMaker *make) { make.centerX.centerY.equalTo(self.headerImageView); make.size.mas_equalTo(CGSizeMake(64, 64)); }]; [self.nameLabel mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.borderImageView.mas_bottom).offset(12); make.left.right.equalTo(self); make.height.mas_equalTo(21); }]; }else{ self.borderImageView.image = [UIImage imageNamed:@"room_rank_third"]; [self.headerImageView mas_remakeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self); make.top.equalTo(self).offset(10); make.size.mas_equalTo(CGSizeMake(50, 50)); }]; [self.borderImageView mas_remakeConstraints:^(MASConstraintMaker *make) { make.centerX.centerY.equalTo(self.headerImageView); make.size.mas_equalTo(CGSizeMake(64, 64)); }]; [self.nameLabel mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.borderImageView.mas_bottom).offset(12); make.left.right.equalTo(self); make.height.mas_equalTo(21); }]; } } -(void)setMd:(QXRoomOnlineList *)md{ _md = md; if (md == nil) { self.headerImageView.image = [UIImage imageNamed:@"user_header_placehoulder"]; self.nameLabel.text = @"虚位以待"; [self.rankBtn setTitle:@"0" forState:(UIControlStateNormal)]; [self.iconBgView removeAllSubviews]; return; } [self.headerImageView sd_setImageWithURL:[NSURL URLWithString:md.avatar] placeholderImage:[UIImage imageNamed:@"user_header_placehoulder"]]; self.nameLabel.text = md.nickname?md.nickname:@""; [self.iconBgView removeAllSubviews]; [self.rankBtn setTitle:[NSString stringWithFormat:@" %@",md.total?md.total:md.gift_prices] forState:(UIControlStateNormal)]; // CGFloat iconWidth = UserIconWidth; // CGFloat iconHeight = UserIconHeight; // CGFloat margin = 6; // for (int i = 0 ; i < md.icon.count; i++) { // UIImageView *iconImageView = [[UIImageView alloc] init]; // [iconImageView sd_setImageWithURL:[NSURL URLWithString:md.icon[i]]]; // [self.iconBgView addSubview:iconImageView]; // if (md.icon.count == 1) { // [iconImageView mas_makeConstraints:^(MASConstraintMaker *make) { // make.width.mas_equalTo(iconWidth); // make.height.mas_equalTo(iconHeight); // make.centerY.centerX.equalTo(self.iconBgView); // }]; // }else if(md.icon.count == 2){ // [iconImageView mas_makeConstraints:^(MASConstraintMaker *make) { // make.width.mas_equalTo(iconWidth); // make.height.mas_equalTo(iconHeight); // make.centerY.equalTo(self.iconBgView); // make.centerX.equalTo(self.iconBgView).offset(-UserIconWidth/2+(margin+iconWidth)*i); // }]; // }else{ // [iconImageView mas_makeConstraints:^(MASConstraintMaker *make) { // make.left.mas_equalTo(i*(iconWidth+margin)); // make.width.mas_equalTo(iconWidth); // make.height.mas_equalTo(iconHeight); // make.centerY.equalTo(self.iconBgView); // }]; // } // // } } -(void)initSubviews{ self.headerImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"user_header_placehoulder"]]; [self.headerImageView addRoundedCornersWithRadius:32]; self.headerImageView.contentMode = UIViewContentModeScaleAspectFill; [self addSubview:self.headerImageView]; MJWeakSelf [self.headerImageView addTapBlock:^(id _Nonnull obj) { if ([weakSelf.md.user_id isExist]) { if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(previewUserInfoWithUserId:)]) { [weakSelf.delegate previewUserInfoWithUserId:weakSelf.md.user_id]; } } }]; [self.headerImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self); make.top.equalTo(self).offset(10); make.size.mas_equalTo(CGSizeMake(64, 64)); }]; self.borderImageView = [[UIImageView alloc] init]; self.borderImageView.contentMode = UIViewContentModeScaleToFill; [self addSubview:self.borderImageView]; [self.borderImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.centerY.equalTo(self.headerImageView); make.size.mas_equalTo(CGSizeMake(80, 80)); }]; self.onlineLabel = [[UILabel alloc] init]; self.onlineLabel.textColor = UIColor.whiteColor; self.onlineLabel.font = [UIFont systemFontOfSize:10]; self.onlineLabel.textAlignment = NSTextAlignmentCenter; self.onlineLabel.backgroundColor = RGB16(0x472ABF); [self.onlineLabel addRoundedCornersWithRadius:7]; self.onlineLabel.text = QXText(@"在线"); [self addSubview:self.onlineLabel]; [self.onlineLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self); make.bottom.equalTo(self.borderImageView); make.height.mas_equalTo(14); make.width.mas_equalTo(32); }]; self.nameLabel = [[UILabel alloc] init]; self.nameLabel.textColor = [UIColor whiteColor]; self.nameLabel.font = [UIFont systemFontOfSize:14]; self.nameLabel.text = QXText(@"虚位以待"); self.nameLabel.textAlignment = NSTextAlignmentCenter; [self addSubview:self.nameLabel]; [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.borderImageView.mas_bottom).offset(25); make.left.right.equalTo(self); make.height.mas_equalTo(21); }]; self.iconBgView = [[UIView alloc] init]; self.iconBgView.hidden = YES; [self addSubview:self.iconBgView]; [self.iconBgView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.equalTo(self); make.top.equalTo(self.nameLabel.mas_bottom); make.height.mas_equalTo(16); }]; self.rankBtn = [[UIButton alloc] init]; [self.rankBtn setImage:[UIImage imageNamed:@"room_rank_value_icon"] forState:(UIControlStateNormal)]; [self.rankBtn setTitle:@" 0" forState:(UIControlStateNormal)]; self.rankBtn.titleLabel.font = [UIFont systemFontOfSize:14]; [self.rankBtn setTitleColor:[UIColor whiteColor] forState:(UIControlStateNormal)]; [self addSubview:self.rankBtn]; [self.rankBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.equalTo(self); make.top.equalTo(self.nameLabel.mas_bottom).offset(5); make.height.mas_equalTo(16); }]; } @end