Files
real-e-party-iOS/YuMi/E-P/NewMine/Views/EPMineHeaderView.m
edwinQQQ 2d0063396c feat: 添加 E-Parti 启动画面及情绪颜色引导功能
主要变更:
1. 新增 ep_splash.png 作为应用启动时的展示图像。
2. 更新 Info.plist 中的应用名称和相关描述,替换为 "E-Parti"。
3. 引入 EPSignatureColorGuideView 和 EPEmotionColorStorage,支持用户选择和保存专属情绪颜色。
4. 在 AppDelegate 中集成情绪颜色引导逻辑,确保用户首次登录时能够选择专属颜色。

此更新旨在提升用户体验,增强应用的品牌识别度,并提供个性化的情绪表达功能。
2025-10-15 15:56:32 +08:00

177 lines
6.1 KiB
Objective-C

//
// EPMineHeaderView.m
// YuMi
//
// Created by AI on 2025-10-09.
// Copyright © 2025 YuMi. All rights reserved.
//
#import "EPMineHeaderView.h"
#import <Masonry/Masonry.h>
#import <SDWebImage/SDWebImage.h>
#import "EPEmotionColorStorage.h"
@interface EPMineHeaderView ()
/// 头像视图
@property (nonatomic, strong) UIImageView *avatarImageView;
/// 昵称标签
@property (nonatomic, strong) UILabel *nicknameLabel;
/// ID 标签
@property (nonatomic, strong) UILabel *idLabel;
/// 设置按钮
@property (nonatomic, strong) UIButton *settingsButton;
@end
@implementation EPMineHeaderView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self setupUI];
}
return self;
}
- (void)setupUI {
// 大圆形头像
self.avatarImageView = [[UIImageView alloc] init];
self.avatarImageView.layer.cornerRadius = 60;
self.avatarImageView.layer.masksToBounds = NO; // 改为 NO 以显示阴影
self.avatarImageView.layer.borderWidth = 3;
self.avatarImageView.layer.borderColor = [UIColor whiteColor].CGColor;
self.avatarImageView.backgroundColor = [UIColor whiteColor];
self.avatarImageView.contentMode = UIViewContentModeScaleAspectFill;
// 为了同时显示圆角和阴影,需要设置 clipsToBounds
self.avatarImageView.clipsToBounds = YES;
[self addSubview:self.avatarImageView];
[self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self);
make.top.equalTo(self).offset(60);
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.nicknameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self);
make.top.equalTo(self.avatarImageView.mas_bottom).offset(16);
}];
// ID
self.idLabel = [[UILabel alloc] init];
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.top.equalTo(self.nicknameLabel.mas_bottom).offset(8);
}];
// 设置按钮(右上角)
self.settingsButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.settingsButton setImage:[UIImage systemImageNamed:@"gearshape"] forState:UIControlStateNormal];
self.settingsButton.tintColor = [UIColor whiteColor];
self.settingsButton.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.2];
self.settingsButton.layer.cornerRadius = 20;
[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.trailing.equalTo(self).offset(-20);
make.size.mas_equalTo(CGSizeMake(40, 40));
}];
}
- (void)updateWithUserInfo:(NSDictionary *)userInfoDict {
// 更新昵称
NSString *nickname = userInfoDict[@"nickname"] ?: @"未设置昵称";
self.nicknameLabel.text = nickname;
// 更新 ID
NSString *uid = userInfoDict[@"uid"] ?: @"";
self.idLabel.text = [NSString stringWithFormat:@"ID:%@", uid];
// 加载头像
NSString *avatarURL = userInfoDict[@"avatar"];
if (avatarURL && avatarURL.length > 0) {
[self.avatarImageView sd_setImageWithURL:[NSURL URLWithString:avatarURL]
placeholderImage:[UIImage imageNamed:@"default_avatar"]];
} else {
// 使用默认头像
self.avatarImageView.image = [UIImage imageNamed:@"default_avatar"];
}
// 应用用户专属情绪颜色
[self applyUserSignatureColor];
}
/// 应用用户专属情绪颜色到头像边框和阴影
- (void)applyUserSignatureColor {
NSString *signatureColor = [EPEmotionColorStorage userSignatureColor];
if (signatureColor) {
// 有专属颜色,使用该颜色
UIColor *color = [self colorFromHex:signatureColor];
// 设置边框颜色
self.avatarImageView.layer.borderColor = color.CGColor;
self.avatarImageView.layer.borderWidth = 4; // 稍微加粗边框
// 设置阴影(使用情绪颜色)
self.avatarImageView.layer.shadowColor = color.CGColor;
self.avatarImageView.layer.shadowOffset = CGSizeMake(0, 4);
self.avatarImageView.layer.shadowOpacity = 0.6;
self.avatarImageView.layer.shadowRadius = 12;
NSLog(@"[EPMineHeaderView] 应用专属颜色: %@", signatureColor);
} else {
// 没有专属颜色,使用默认白色边框
self.avatarImageView.layer.borderColor = [UIColor whiteColor].CGColor;
self.avatarImageView.layer.borderWidth = 3;
// 默认轻微阴影
self.avatarImageView.layer.shadowColor = [UIColor blackColor].CGColor;
self.avatarImageView.layer.shadowOffset = CGSizeMake(0, 2);
self.avatarImageView.layer.shadowOpacity = 0.2;
self.avatarImageView.layer.shadowRadius = 8;
}
}
/// Hex 转 UIColor
- (UIColor *)colorFromHex:(NSString *)hexString {
unsigned rgbValue = 0;
NSScanner *scanner = [NSScanner scannerWithString:hexString];
[scanner setScanLocation:1]; // 跳过 #
[scanner scanHexInt:&rgbValue];
return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0
green:((rgbValue & 0xFF00) >> 8)/255.0
blue:(rgbValue & 0xFF)/255.0
alpha:1.0];
}
- (void)settingsButtonTapped {
NSLog(@"[EPMineHeaderView] 设置按钮点击");
// 使用 block 回调
if (self.onSettingsButtonTapped) {
self.onSettingsButtonTapped();
}
}
@end