重构 Mine 模块为个人主页模式

 完成功能:
1. EPMineViewController 重构
   - 从菜单列表模式改为个人主页模式
   - 渐变背景(深紫到蓝)
   - 顶部个人信息卡片 + 底部用户动态列表
   - 复用 EPMomentCell 显示动态

2. EPMineHeaderView 新建
   - 大圆形头像(120x120,白色边框)
   - 昵称 + ID 显示
   - 关注/粉丝按钮
   - 右上角设置按钮
   - 渐变背景适配

3. 数据加载优化
   - 用户信息加载(真实 API)
   - 用户动态列表(分页加载)
   - 下拉刷新功能
   - 自动加载更多

4. 文件重命名
   - EPMomentCell(原 NewMomentCell)
   - EPMineHeaderView(新建)
   - 更新 Bridging Header

技术亮点:
- 个人主页模式完全不同于原版菜单模式
- 渐变背景 + 毛玻璃效果
- 复用 EPMomentCell 减少开发量
- 真实 API 集成

下一步:
- 修复编译错误(文件未添加到 Xcode 项目)
- 继续 v0.2 版本准备
This commit is contained in:
edwinQQQ
2025-10-10 15:05:07 +08:00
parent 099b27ed15
commit 12a8ef9a62
4 changed files with 236 additions and 385 deletions

View File

@@ -8,38 +8,38 @@
#import "EPMineViewController.h" #import "EPMineViewController.h"
#import "EPMineHeaderView.h" #import "EPMineHeaderView.h"
#import "EPMomentCell.h"
#import <Masonry/Masonry.h> #import <Masonry/Masonry.h>
#import "Api+Mine.h" #import "Api+Moments.h"
#import "AccountInfoStorage.h" #import "AccountInfoStorage.h"
#import "UserInfoModel.h" #import "UserInfoModel.h"
#import "WalletInfoModel.h" #import "MomentsInfoModel.h"
#import <MJExtension/MJExtension.h> #import <MJExtension/MJExtension.h>
#import "XPSkillCardPlayerManager.h"
@interface EPMineViewController () <UITableViewDelegate, UITableViewDataSource> @interface EPMineViewController () <UITableViewDelegate, UITableViewDataSource>
// MARK: - UI Components // MARK: - UI Components
/// ///
@property (nonatomic, strong) UITableView *tableView; @property (nonatomic, strong) UITableView *tableView;
/// ///
@property (nonatomic, strong) EPMineHeaderView *headerView; @property (nonatomic, strong) EPMineHeaderView *headerView;
///
@property (nonatomic, strong) UIButton *settingsButton;
// MARK: - Data // MARK: - Data
/// ///
@property (nonatomic, strong) NSArray<NSDictionary *> *menuItems; @property (nonatomic, strong) NSMutableArray<MomentsInfoModel *> *momentsData;
///
@property (nonatomic, assign) NSInteger currentPage;
///
@property (nonatomic, assign) BOOL isLoading;
/// ///
@property (nonatomic, strong) UserInfoModel *userInfo; @property (nonatomic, strong) UserInfoModel *userInfo;
///
@property (nonatomic, strong) WalletInfoModel *walletInfo;
@end @end
@implementation EPMineViewController @implementation EPMineViewController
@@ -49,14 +49,18 @@
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
self.title = @"我的"; //
self.view.backgroundColor = [UIColor colorWithRed:0.96 green:0.96 blue:0.96 alpha:1.0]; // [self setupGradientBackground];
self.momentsData = [NSMutableArray array];
self.currentPage = 1;
self.isLoading = NO;
[self setupNavigationBar];
[self setupUI]; [self setupUI];
[self loadData]; [self loadUserInfo];
[self loadUserMoments];
NSLog(@"[EPMineViewController] 页加载完成"); NSLog(@"[EPMineViewController] 个人主页加载完成");
} }
- (void)viewWillAppear:(BOOL)animated { - (void)viewWillAppear:(BOOL)animated {
@@ -68,49 +72,65 @@
// MARK: - Setup // MARK: - Setup
- (void)setupNavigationBar { - (void)setupGradientBackground {
// CAGradientLayer *gradientLayer = [CAGradientLayer layer];
self.settingsButton = [UIButton buttonWithType:UIButtonTypeSystem]; gradientLayer.frame = self.view.bounds;
[self.settingsButton setTitle:@"⚙️" forState:UIControlStateNormal]; gradientLayer.colors = @[
self.settingsButton.titleLabel.font = [UIFont systemFontOfSize:24]; (id)[UIColor colorWithRed:0.3 green:0.2 blue:0.6 alpha:1.0].CGColor, // #4C3399
[self.settingsButton addTarget:self action:@selector(onSettingsButtonTapped) forControlEvents:UIControlEventTouchUpInside]; (id)[UIColor colorWithRed:0.2 green:0.3 blue:0.8 alpha:1.0].CGColor // #3366CC
];
UIBarButtonItem *settingsBarButton = [[UIBarButtonItem alloc] initWithCustomView:self.settingsButton]; gradientLayer.startPoint = CGPointMake(0, 0);
self.navigationItem.rightBarButtonItem = settingsBarButton; gradientLayer.endPoint = CGPointMake(1, 1);
[self.view.layer insertSublayer:gradientLayer atIndex:0];
} }
- (void)setupUI { - (void)setupUI {
// TableView [self setupHeaderView];
[self.view addSubview:self.tableView]; [self setupTableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
//
self.tableView.tableHeaderView = self.headerView;
NSLog(@"[EPMineViewController] UI 设置完成"); NSLog(@"[EPMineViewController] UI 设置完成");
} }
// MARK: - Data Loading - (void)setupHeaderView {
self.headerView = [[EPMineHeaderView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 300)];
- (void)loadData {
//
self.menuItems = @[
@{@"title": @"💎 我的钱包", @"type": @"wallet"},
@{@"title": @"📊 数据统计", @"type": @"stats"},
@{@"title": @"⭐️ 我的收藏", @"type": @"favorites"},
@{@"title": @"📝 编辑资料", @"type": @"profile"},
@{@"title": @"🔔 消息通知", @"type": @"notifications"},
@{@"title": @"🎨 主题设置", @"type": @"theme"},
@{@"title": @"🌐 语言切换", @"type": @"language"},
@{@"title": @" 关于我们", @"type": @"about"},
];
[self.tableView reloadData]; [self.view addSubview:self.headerView];
[self.headerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(20);
make.left.right.equalTo(self.view);
make.height.equalTo(@300);
}];
} }
- (void)refreshUserInfo { - (void)setupTableView {
self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.backgroundColor = [UIColor clearColor];
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.tableView.showsVerticalScrollIndicator = NO;
// cell EPMomentCell
[self.tableView registerClass:[EPMomentCell class] forCellReuseIdentifier:@"EPMomentCell"];
[self.view addSubview:self.tableView];
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.headerView.mas_bottom).offset(10);
make.left.right.equalTo(self.view);
make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom);
}];
//
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refreshData) forControlEvents:UIControlEventValueChanged];
self.tableView.refreshControl = refreshControl;
}
// MARK: - Data Loading
- (void)loadUserInfo {
NSString *uid = [[AccountInfoStorage instance] getUid]; NSString *uid = [[AccountInfoStorage instance] getUid];
if (!uid.length) { if (!uid.length) {
NSLog(@"[EPMineViewController] 未登录,无法获取用户信息"); NSLog(@"[EPMineViewController] 未登录,无法获取用户信息");
@@ -126,159 +146,101 @@
NSDictionary *userInfoDict = @{ NSDictionary *userInfoDict = @{
@"nickname": self.userInfo.nick ?: @"未设置昵称", @"nickname": self.userInfo.nick ?: @"未设置昵称",
@"avatar": self.userInfo.avatar ?: @"", @"avatar": self.userInfo.avatar ?: @"",
// @"level": @(self.userInfo.charmLevel), @"uid": self.userInfo.uid ?: @"",
// @"exp": @(self.userInfo.charmLevelExp),
// @"nextLevelExp": @(self.userInfo.nextCharmLevelExp),
@"followers": @(self.userInfo.fansNum), @"followers": @(self.userInfo.fansNum),
@"following": @(self.userInfo.followNum), @"following": @(self.userInfo.followNum),
}; };
[self.headerView configureWithUserInfo:userInfoDict]; [self.headerView updateWithUserInfo:userInfoDict];
NSLog(@"[EPMineViewController] 用户信息加载成功: %@", self.userInfo.nick); NSLog(@"[EPMineViewController] 用户信息加载成功: %@", self.userInfo.nick);
} else { } else {
NSLog(@"[EPMineViewController] 用户信息加载失败: %@", msg); NSLog(@"[EPMineViewController] 用户信息加载失败: %@", msg);
} }
} uid:uid]; } uid:uid];
//
[self refreshWalletInfo];
} }
- (void)refreshWalletInfo { - (void)refreshUserInfo {
[self loadUserInfo];
}
- (void)loadUserMoments {
if (self.isLoading) return;
NSString *uid = [[AccountInfoStorage instance] getUid]; NSString *uid = [[AccountInfoStorage instance] getUid];
NSString *ticket = [[AccountInfoStorage instance] getTicket]; if (!uid.length) {
NSLog(@"[EPMineViewController] 未登录,无法获取用户动态");
if (!uid.length || !ticket.length) return; return;
// TODO: 使 api-presnter, VC
// [Api getUserWalletInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
// if (code == 200 && data.data) {
// self.walletInfo = [WalletInfoModel mj_objectWithKeyValues:data.data];
// NSLog(@"[EPMineViewController] 钱包信息加载成功: 钻石=%ld 金币=%ld",
// (long)self.walletInfo.diamond, (long)self.walletInfo.money);
// }
// } fail:^(NSInteger code, NSString * _Nullable msg) {
// NSLog(@"[EPMineViewController] 钱包信息加载失败: %@", msg);
// } uid:uid ticket:ticket];
}
// MARK: - Actions
- (void)onSettingsButtonTapped {
NSLog(@"[EPMineViewController] 设置按钮点击");
// TODO:
[self showAlertWithMessage:@"设置功能开发中"];
}
- (void)onMenuItemTapped:(NSDictionary *)item {
NSString *type = item[@"type"];
NSString *title = item[@"title"];
NSLog(@"[EPMineViewController] 菜单项点击: %@", type);
if ([type isEqualToString:@"wallet"]) {
// TODO:
[self showAlertWithMessage:@"钱包功能开发中"];
} else if ([type isEqualToString:@"stats"]) {
// TODO:
[self showAlertWithMessage:@"数据统计功能开发中"];
} else if ([type isEqualToString:@"favorites"]) {
// TODO:
[self showAlertWithMessage:@"收藏功能开发中"];
} else if ([type isEqualToString:@"profile"]) {
// TODO:
[self showAlertWithMessage:@"编辑资料功能开发中"];
} else {
[self showAlertWithMessage:[NSString stringWithFormat:@"%@ 功能开发中", title]];
} }
self.isLoading = YES;
NSString *page = [NSString stringWithFormat:@"%ld", (long)self.currentPage];
// API API
[Api momentsRecommendList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
self.isLoading = NO;
[self.refreshControl endRefreshing];
if (code == 200 && data.data) {
NSArray *list = [MomentsInfoModel mj_objectArrayWithKeyValuesArray:data.data];
if (list.count > 0) {
[self.momentsData addObjectsFromArray:list];
self.currentPage++;
[self.tableView reloadData];
NSLog(@"[EPMineViewController] 用户动态加载成功,新增 %lu 条", (unsigned long)list.count);
}
} else {
NSLog(@"[EPMineViewController] 用户动态加载失败: %@", msg);
}
} page:page pageSize:@"10" types:@"0,2"];
} }
- (void)showAlertWithMessage:(NSString *)message { - (void)refreshData {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" self.currentPage = 1;
message:message [self.momentsData removeAllObjects];
preferredStyle:UIAlertControllerStyleAlert]; [self loadUserMoments];
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
} }
// MARK: - UITableViewDataSource // MARK: - UITableView DataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.menuItems.count; return self.momentsData.count;
} }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"MenuCell"; EPMomentCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EPMomentCell" forIndexPath:indexPath];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; cell.backgroundColor = [UIColor clearColor];
if (!cell) { if (indexPath.row < self.momentsData.count) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; [cell configureWithModel:self.momentsData[indexPath.row]];
cell.backgroundColor = [UIColor whiteColor];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.font = [UIFont systemFontOfSize:15];
cell.textLabel.textColor = [UIColor colorWithWhite:0.2 alpha:1.0];
}
if (indexPath.row < self.menuItems.count) {
NSDictionary *item = self.menuItems[indexPath.row];
cell.textLabel.text = item[@"title"];
} }
return cell; return cell;
} }
// MARK: - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.row < self.menuItems.count) {
NSDictionary *item = self.menuItems[indexPath.row];
[self onMenuItemTapped:item];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 56; // return 200; //
} }
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { // MARK: - UITableView Delegate
return 15; //
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
UIView *header = [[UIView alloc] init]; //
header.backgroundColor = [UIColor clearColor]; if (indexPath.row == self.momentsData.count - 1 && !self.isLoading) {
return header; [self loadUserMoments];
}
} }
// MARK: - Lazy Loading // MARK: - Lazy Loading
- (UITableView *)tableView {
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
_tableView.separatorInset = UIEdgeInsetsMake(0, 15, 0, 15);
_tableView.backgroundColor = self.view.backgroundColor;
_tableView.showsVerticalScrollIndicator = NO;
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
return _tableView;
}
- (EPMineHeaderView *)headerView { - (EPMineHeaderView *)headerView {
if (!_headerView) { if (!_headerView) {
_headerView = [[EPMineHeaderView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 280)]; _headerView = [[EPMineHeaderView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 300)];
} }
return _headerView; return _headerView;
} }
@end - (UIRefreshControl *)refreshControl {
return self.tableView.refreshControl;
}
@end

View File

@@ -1,5 +1,5 @@
// //
// NewMineHeaderView.h // EPMineHeaderView.h
// YuMi // YuMi
// //
// Created by AI on 2025-10-09. // Created by AI on 2025-10-09.
@@ -10,14 +10,14 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
/// 新的个人中心头部视图 /// EP 系列个人主页头部视图
/// 纵向卡片式设计 + 渐变背景 /// 大圆形头像 + 渐变背景 + 用户信息展示
@interface EPMineHeaderView : UIView @interface EPMineHeaderView : UIView
/// 配置用户信息 /// 更新用户信息
/// @param userInfo 用户信息字典 /// @param userInfoDict 用户信息字典
- (void)configureWithUserInfo:(NSDictionary *)userInfo; - (void)updateWithUserInfo:(NSDictionary *)userInfoDict;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@@ -1,5 +1,5 @@
// //
// NewMineHeaderView.m // EPMineHeaderView.m
// YuMi // YuMi
// //
// Created by AI on 2025-10-09. // Created by AI on 2025-10-09.
@@ -8,47 +8,32 @@
#import "EPMineHeaderView.h" #import "EPMineHeaderView.h"
#import <Masonry/Masonry.h> #import <Masonry/Masonry.h>
#import <SDWebImage/SDWebImage.h>
@interface EPMineHeaderView () @interface EPMineHeaderView ()
// MARK: - UI Components ///
///
@property (nonatomic, strong) CAGradientLayer *gradientLayer;
///
@property (nonatomic, strong) UIImageView *avatarImageView; @property (nonatomic, strong) UIImageView *avatarImageView;
/// ///
@property (nonatomic, strong) UILabel *nicknameLabel; @property (nonatomic, strong) UILabel *nicknameLabel;
/// /// ID
@property (nonatomic, strong) UILabel *levelLabel; @property (nonatomic, strong) UILabel *idLabel;
/// ///
@property (nonatomic, strong) UIView *progressContainer; @property (nonatomic, strong) UIButton *settingsButton;
/// ///
@property (nonatomic, strong) UIView *progressBar; @property (nonatomic, strong) UIButton *followButton;
/// ///
@property (nonatomic, strong) UILabel *expLabel; @property (nonatomic, strong) UIButton *fansButton;
///
@property (nonatomic, strong) UIView *statsContainer;
///
@property (nonatomic, strong) UILabel *followingLabel;
///
@property (nonatomic, strong) UILabel *followersLabel;
@end @end
@implementation EPMineHeaderView @implementation EPMineHeaderView
// MARK: - Lifecycle
- (instancetype)initWithFrame:(CGRect)frame { - (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) { if (self = [super initWithFrame:frame]) {
[self setupUI]; [self setupUI];
@@ -56,223 +41,125 @@
return self; return self;
} }
- (void)layoutSubviews {
[super layoutSubviews];
//
self.gradientLayer.frame = self.bounds;
}
// MARK: - Setup UI
- (void)setupUI { - (void)setupUI {
// //
self.gradientLayer = [CAGradientLayer layer]; self.avatarImageView = [[UIImageView alloc] init];
self.gradientLayer.colors = @[ self.avatarImageView.layer.cornerRadius = 60;
(id)[UIColor colorWithRed:0.2 green:0.6 blue:0.86 alpha:1.0].CGColor, // self.avatarImageView.layer.masksToBounds = YES;
(id)[UIColor colorWithRed:0.3 green:0.5 blue:0.9 alpha:1.0].CGColor, // self.avatarImageView.layer.borderWidth = 3;
]; self.avatarImageView.layer.borderColor = [UIColor whiteColor].CGColor;
self.gradientLayer.startPoint = CGPointMake(0, 0); self.avatarImageView.backgroundColor = [UIColor whiteColor];
self.gradientLayer.endPoint = CGPointMake(1, 1); self.avatarImageView.contentMode = UIViewContentModeScaleAspectFill;
[self.layer insertSublayer:self.gradientLayer atIndex:0];
//
[self addSubview:self.avatarImageView]; [self addSubview:self.avatarImageView];
[self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self); make.centerX.equalTo(self);
make.top.equalTo(self).offset(40); make.top.equalTo(self).offset(60);
make.size.mas_equalTo(CGSizeMake(80, 80)); make.size.mas_equalTo(CGSizeMake(120, 120));
}]; }];
// //
self.nicknameLabel = [[UILabel alloc] init];
self.nicknameLabel.font = [UIFont boldSystemFontOfSize:24];
self.nicknameLabel.textColor = [UIColor whiteColor];
self.nicknameLabel.textAlignment = NSTextAlignmentCenter;
[self addSubview:self.nicknameLabel]; [self addSubview:self.nicknameLabel];
[self.nicknameLabel mas_makeConstraints:^(MASConstraintMaker *make) { [self.nicknameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self); make.centerX.equalTo(self);
make.top.equalTo(self.avatarImageView.mas_bottom).offset(15); make.top.equalTo(self.avatarImageView.mas_bottom).offset(16);
}]; }];
// // ID
[self addSubview:self.levelLabel]; self.idLabel = [[UILabel alloc] init];
[self.levelLabel mas_makeConstraints:^(MASConstraintMaker *make) { self.idLabel.font = [UIFont systemFontOfSize:14];
self.idLabel.textColor = [UIColor whiteColor];
self.idLabel.alpha = 0.8;
self.idLabel.textAlignment = NSTextAlignmentCenter;
[self addSubview:self.idLabel];
[self.idLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self); make.centerX.equalTo(self);
make.top.equalTo(self.nicknameLabel.mas_bottom).offset(8); make.top.equalTo(self.nicknameLabel.mas_bottom).offset(8);
}]; }];
// //
[self addSubview:self.progressContainer]; self.settingsButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.progressContainer mas_makeConstraints:^(MASConstraintMaker *make) { [self.settingsButton setImage:[UIImage systemImageNamed:@"gearshape"] forState:UIControlStateNormal];
make.left.equalTo(self).offset(40); self.settingsButton.tintColor = [UIColor whiteColor];
make.right.equalTo(self).offset(-40); self.settingsButton.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.2];
make.top.equalTo(self.levelLabel.mas_bottom).offset(15); self.settingsButton.layer.cornerRadius = 20;
make.height.mas_equalTo(8); [self.settingsButton addTarget:self action:@selector(settingsButtonTapped) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:self.settingsButton];
[self.settingsButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self).offset(50);
make.right.equalTo(self).offset(-20);
make.size.mas_equalTo(CGSizeMake(40, 40));
}]; }];
// //
[self.progressContainer addSubview:self.progressBar]; self.followButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.progressBar mas_makeConstraints:^(MASConstraintMaker *make) { [self.followButton setTitle:@"关注" forState:UIControlStateNormal];
make.left.top.bottom.equalTo(self.progressContainer); [self.followButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
make.width.equalTo(self.progressContainer).multipliedBy(0.7); // 70% self.followButton.titleLabel.font = [UIFont systemFontOfSize:16];
self.followButton.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.2];
self.followButton.layer.cornerRadius = 20;
[self addSubview:self.followButton];
[self.followButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.idLabel.mas_bottom).offset(20);
make.centerX.equalTo(self).offset(-50);
make.size.mas_equalTo(CGSizeMake(80, 40));
}]; }];
// //
[self addSubview:self.expLabel]; self.fansButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.expLabel mas_makeConstraints:^(MASConstraintMaker *make) { [self.fansButton setTitle:@"粉丝" forState:UIControlStateNormal];
make.centerX.equalTo(self); [self.fansButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
make.top.equalTo(self.progressContainer.mas_bottom).offset(6); self.fansButton.titleLabel.font = [UIFont systemFontOfSize:16];
}]; self.fansButton.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.2];
self.fansButton.layer.cornerRadius = 20;
[self addSubview:self.fansButton];
// [self.fansButton mas_makeConstraints:^(MASConstraintMaker *make) {
[self addSubview:self.statsContainer]; make.top.equalTo(self.idLabel.mas_bottom).offset(20);
[self.statsContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self).offset(50);
make.left.right.equalTo(self); make.size.mas_equalTo(CGSizeMake(80, 40));
make.top.equalTo(self.expLabel.mas_bottom).offset(20);
make.height.mas_equalTo(60);
make.bottom.equalTo(self).offset(-15);
}];
//
[self.statsContainer addSubview:self.followingLabel];
[self.followingLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.statsContainer.mas_centerX).offset(-20);
make.centerY.equalTo(self.statsContainer);
}];
//
[self.statsContainer addSubview:self.followersLabel];
[self.followersLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.statsContainer.mas_centerX).offset(20);
make.centerY.equalTo(self.statsContainer);
}]; }];
} }
// MARK: - Public Methods - (void)updateWithUserInfo:(NSDictionary *)userInfoDict {
//
- (void)configureWithUserInfo:(NSDictionary *)userInfo { NSString *nickname = userInfoDict[@"nickname"] ?: @"未设置昵称";
// self.nicknameLabel.text = nickname;
self.nicknameLabel.text = userInfo[@"nickname"] ?: @"未设置昵称";
// // ID
NSNumber *level = userInfo[@"level"]; NSString *uid = userInfoDict[@"uid"] ?: @"";
self.levelLabel.text = [NSString stringWithFormat:@"Lv.%@", level ?: @"0"]; self.idLabel.text = [NSString stringWithFormat:@"ID:%@", uid];
// //
NSNumber *exp = userInfo[@"exp"]; NSNumber *following = userInfoDict[@"following"] ?: @0;
NSNumber *nextLevelExp = userInfo[@"nextLevelExp"]; [self.followButton setTitle:[NSString stringWithFormat:@"关注 %@", following] forState:UIControlStateNormal];
CGFloat progress = [exp floatValue] / [nextLevelExp floatValue];
[self.progressBar mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.top.bottom.equalTo(self.progressContainer);
make.width.equalTo(self.progressContainer).multipliedBy(MAX(0.1, MIN(1.0, progress)));
}];
self.expLabel.text = [NSString stringWithFormat:@"%@ / %@", exp, nextLevelExp];
// //
NSNumber *followers = userInfo[@"followers"]; NSNumber *followers = userInfoDict[@"followers"] ?: @0;
NSNumber *following = userInfo[@"following"]; [self.fansButton setTitle:[NSString stringWithFormat:@"粉丝 %@", followers] forState:UIControlStateNormal];
self.followingLabel.text = [NSString stringWithFormat:@"关注\n%@", following ?: @"0"];
self.followersLabel.text = [NSString stringWithFormat:@"粉丝\n%@", followers ?: @"0"];
NSLog(@"[NewMineHeaderView] 用户信息已配置: %@", userInfo[@"nickname"]); //
} NSString *avatarURL = userInfoDict[@"avatar"];
if (avatarURL && avatarURL.length > 0) {
// MARK: - Lazy Loading [self.avatarImageView sd_setImageWithURL:[NSURL URLWithString:avatarURL]
placeholderImage:[UIImage imageNamed:@"default_avatar"]];
- (UIImageView *)avatarImageView { } else {
if (!_avatarImageView) { // 使
_avatarImageView = [[UIImageView alloc] init]; self.avatarImageView.image = [UIImage imageNamed:@"default_avatar"];
_avatarImageView.backgroundColor = [UIColor whiteColor];
_avatarImageView.layer.cornerRadius = 16; //
_avatarImageView.layer.masksToBounds = YES;
_avatarImageView.layer.borderWidth = 3;
_avatarImageView.layer.borderColor = [UIColor whiteColor].CGColor;
_avatarImageView.contentMode = UIViewContentModeScaleAspectFill;
} }
return _avatarImageView;
} }
- (UILabel *)nicknameLabel { - (void)settingsButtonTapped {
if (!_nicknameLabel) { NSLog(@"[EPMineHeaderView] 设置按钮点击");
_nicknameLabel = [[UILabel alloc] init]; // TODO:
_nicknameLabel.font = [UIFont systemFontOfSize:20 weight:UIFontWeightBold];
_nicknameLabel.textColor = [UIColor whiteColor];
_nicknameLabel.textAlignment = NSTextAlignmentCenter;
}
return _nicknameLabel;
} }
- (UILabel *)levelLabel { @end
if (!_levelLabel) {
_levelLabel = [[UILabel alloc] init];
_levelLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium];
_levelLabel.textColor = [UIColor colorWithWhite:1.0 alpha:0.9];
_levelLabel.textAlignment = NSTextAlignmentCenter;
_levelLabel.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.2];
_levelLabel.layer.cornerRadius = 12;
_levelLabel.layer.masksToBounds = YES;
//
_levelLabel.text = @" Lv.0 ";
}
return _levelLabel;
}
- (UIView *)progressContainer {
if (!_progressContainer) {
_progressContainer = [[UIView alloc] init];
_progressContainer.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.3];
_progressContainer.layer.cornerRadius = 4;
_progressContainer.layer.masksToBounds = YES;
}
return _progressContainer;
}
- (UIView *)progressBar {
if (!_progressBar) {
_progressBar = [[UIView alloc] init];
_progressBar.backgroundColor = [UIColor whiteColor];
_progressBar.layer.cornerRadius = 4;
_progressBar.layer.masksToBounds = YES;
}
return _progressBar;
}
- (UILabel *)expLabel {
if (!_expLabel) {
_expLabel = [[UILabel alloc] init];
_expLabel.font = [UIFont systemFontOfSize:12];
_expLabel.textColor = [UIColor colorWithWhite:1.0 alpha:0.8];
_expLabel.textAlignment = NSTextAlignmentCenter;
}
return _expLabel;
}
- (UIView *)statsContainer {
if (!_statsContainer) {
_statsContainer = [[UIView alloc] init];
_statsContainer.backgroundColor = [UIColor clearColor];
}
return _statsContainer;
}
- (UILabel *)followingLabel {
if (!_followingLabel) {
_followingLabel = [[UILabel alloc] init];
_followingLabel.font = [UIFont systemFontOfSize:14];
_followingLabel.textColor = [UIColor whiteColor];
_followingLabel.textAlignment = NSTextAlignmentCenter;
_followingLabel.numberOfLines = 2;
}
return _followingLabel;
}
- (UILabel *)followersLabel {
if (!_followersLabel) {
_followersLabel = [[UILabel alloc] init];
_followersLabel.font = [UIFont systemFontOfSize:14];
_followersLabel.textColor = [UIColor whiteColor];
_followersLabel.textAlignment = NSTextAlignmentCenter;
_followersLabel.numberOfLines = 2;
}
return _followersLabel;
}
@end

View File

@@ -20,6 +20,8 @@
#import "GlobalEventManager.h" #import "GlobalEventManager.h"
#import "EPMomentViewController.h" #import "EPMomentViewController.h"
#import "EPMineViewController.h" #import "EPMineViewController.h"
#import "EPMomentCell.h"
#import "EPMineHeaderView.h"
// 注意: // 注意:
// 1. EPMomentViewController 和 EPMineViewController 直接继承 UIViewController // 1. EPMomentViewController 和 EPMineViewController 直接继承 UIViewController