Files
keyboard/keyBoard/Class/Home/VC/HomeHotVC.m
2025-12-03 20:02:37 +08:00

183 lines
6.7 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// HomeHotVC.m
// keyBoard
//
// Created by Mac on 2025/11/6.
//
#import "HomeHotVC.h"
// 视图
#import "KBTopThreeView.h"
#import "KBHomeVM.h"
#import "KBCharacter.h"
#import "HomeHotCell.h"
#import "HomeRankVC.h"
#import "KBSearchVC.h"
#import "HomeRankDetailPopView.h"
#import "LSTPopView.h"
#import <HWPanModal/HWPanModal.h>
@interface HomeHotVC () <UITableViewDataSource, UITableViewDelegate>
// 顶部前三名视图
@property (nonatomic, strong) KBTopThreeView *topThreeView;
/// 首页排行榜 VM
@property (nonatomic, strong) KBHomeVM *homeVM;
/// 完整的排行榜数据(接口返回)
@property (nonatomic, copy) NSArray<KBCharacter *> *allCharacters;
/// 列表区域使用的数据:从第 4 名开始
@property (nonatomic, copy) NSArray<KBCharacter *> *listCharacters;
@end
@interface HomeHotVC ()
@end
@implementation HomeHotVC
- (void)viewDidLoad {
[super viewDidLoad];
// 搭建 UI
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
// 顶部前三名作为 tableHeaderView注意tableHeaderView 需设定明确高度)
CGFloat headerH = 280.0;
self.topThreeView = [[KBTopThreeView alloc] initWithFrame:CGRectMake(0, 0, KB_SCREEN_WIDTH, headerH)];
self.tableView.tableHeaderView = self.topThreeView;
// 请求排行榜数据
self.homeVM = [KBHomeVM new];
KBWeakSelf
[self.homeVM fetchRankListWithParams:nil
needShow:YES
completion:^(NSArray<KBCharacter *> * _Nullable list, NSError * _Nullable error) {
if (error) {
// 错误提示已经在 VM 内部通过 HUD 处理,这里不再重复提示
return;
}
weakSelf.allCharacters = list ?: @[];
// 顶部前三名数据:直接取前三个模型交给 KBTopThreeView
NSInteger topCount = MIN(3, weakSelf.allCharacters.count);
if (topCount > 0) {
NSRange range = NSMakeRange(0, topCount);
NSArray<KBCharacter *> *topThree = [weakSelf.allCharacters subarrayWithRange:range];
[weakSelf.topThreeView configWithCharacters:topThree];
}
// 列表部分:从第 4 名开始
if (weakSelf.allCharacters.count > 3) {
NSRange range = NSMakeRange(3, weakSelf.allCharacters.count - 3);
weakSelf.listCharacters = [weakSelf.allCharacters subarrayWithRange:range];
} else {
weakSelf.listCharacters = @[];
}
[weakSelf.tableView reloadData];
// 通知承载 HomeHotVC 的“外层 PanModal 容器”刷新布局。
// 1) 如果 HomeHotVC 是作为子控制器嵌在某个 VC 里(例如 HomeSheetVC
// 则该 VC 实现了 hw_panModalSetNeedsLayoutUpdate。
UIViewController *parent = weakSelf.parentViewController;
id target = nil;
if ([parent respondsToSelector:@selector(hw_panModalSetNeedsLayoutUpdate)]) {
target = parent;
} else {
// 2) 如果 HomeHotVC 是直接嵌在 HWPanModalContentView如 KBPanModalView
// parentViewController 可能为 nil需要顺着 view.superview 向上寻找。
UIView *v = weakSelf.view;
while (v && ![v respondsToSelector:@selector(hw_panModalSetNeedsLayoutUpdate)]) {
v = v.superview;
}
if (v && [v respondsToSelector:@selector(hw_panModalSetNeedsLayoutUpdate)]) {
target = v;
}
}
if (target) {
[(id)target hw_panModalSetNeedsLayoutUpdate];
}
}];
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.listCharacters.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
HomeHotCell *cell = [tableView dequeueReusableCellWithIdentifier:HomeHotCell.reuseId forIndexPath:indexPath];
KBCharacter *item = self.listCharacters[indexPath.row];
// 直接把模型交给 cell由 cell 自己负责展示
cell.character = item;
return cell;
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 84.0;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
// KBSearchVC *vc = [[KBSearchVC alloc] init];
// [self.navigationController pushViewController:vc animated:true];
// UINavigationController *nav = KB_CURRENT_NAV;
// [nav pushViewController:vc animated:true];
NSLog(@"===");
// 点击卡片 -> 展示弹窗
KBCharacter *c = self.listCharacters[indexPath.row];
// 自定义内容视图(尺寸可按需调节)
CGFloat width = MIN(KB_SCREEN_WIDTH - 76, 420);
HomeRankDetailPopView *content = [[HomeRankDetailPopView alloc] initWithFrame:CGRectMake(0, 0, width, 460)];
NSString *title = c.characterName ?: @"High EQ";
NSString *people = c.download ?: @"Download: 1 Million";
NSString *desc = @"Be Neither Too Close\nNor Too Distant"; // 示例文案
[content configWithAvatar:nil title:title download:people desc:desc];
// 创建并弹出
LSTPopView *pop = [LSTPopView initWithCustomView:content
parentView:nil
popStyle:LSTPopStyleScale
dismissStyle:LSTDismissStyleScale];
pop.hemStyle = LSTHemStyleCenter; // 居中
pop.bgColor = [[UIColor blackColor] colorWithAlphaComponent:0.4];
pop.isClickBgDismiss = YES; // 点击背景关闭
pop.cornerRadius = 0; // 自定义 view 自处理圆角
__weak typeof(pop) weakPop = pop;
content.saveHandler = ^{ [weakPop dismiss]; };
content.closeHandler = ^{ [weakPop dismiss]; };
[pop pop];
}
#pragma mark - Lazy
- (BaseTableView *)tableView {
if (!_tableView) {
// 使用 BaseTableView统一默认配置
_tableView = [[BaseTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
_tableView.dataSource = self;
_tableView.delegate = self;
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // 设计为卡片式,去掉系统分割线
_tableView.showsVerticalScrollIndicator = NO;
_tableView.contentInset = UIEdgeInsetsMake(8, 0, KB_SafeAreaBottom(), 0);
[_tableView registerClass:HomeHotCell.class forCellReuseIdentifier:HomeHotCell.reuseId];
}
return _tableView;
}
@end