Files
keyboard/keyBoard/Class/Home/V/HomeHeadView.m
2025-11-07 14:21:03 +08:00

250 lines
9.0 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.

//
// HomeHeadView.m
// keyBoard
//
// Created by Mac on 2025/11/6.
//
#import "HomeHeadView.h"
#import "UIImage+KBColor.h"
#import "KBTopImageButton.h"
@interface HomeHeadView()
// 顶部会员卡图片
@property (nonatomic, strong) UIImageView *vipImageView;
// 主/副标题
@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UILabel *subTitleLabel;
// 中部四个功能按钮容器
@property (nonatomic, strong) UIView *featuresContainer;
@property (nonatomic, strong) NSArray<KBTopImageButton *> *featureButtons;
// 底部购买按钮
@property (nonatomic, strong) UIButton *buyButton;
@end
@implementation HomeHeadView
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor clearColor];
[self setupViews];
[self setupConstraints];
[self defaultData];
}
return self;
}
#pragma mark - Layout
- (void)layoutSubviews {
[super layoutSubviews];
// 根据实际尺寸更新购买按钮背景的渐变图避免在未布局前计算尺寸为0
if (self.buyButton.currentBackgroundImage == nil) {
CGSize size = self.buyButton.bounds.size;
if (size.width > 0 && size.height > 0) {
UIImage *bg = [UIImage kb_gradientImageWithColors:@[[UIColor colorWithHex:0xE6FFF4], [UIColor colorWithHex:0xA6FFD8]]
locations:nil
size:size
direction:KBGradientDirectionLeftToRight
cornerRadius:size.height * 0.5];
[self.buyButton setBackgroundImage:bg forState:UIControlStateNormal];
}
}
}
#pragma mark - UI
- (void)setupViews {
[self addSubview:self.vipImageView];
[self addSubview:self.titleLabel];
[self addSubview:self.subTitleLabel];
[self addSubview:self.featuresContainer];
[self addSubview:self.buyButton];
}
- (void)setupConstraints {
// 顶部图
[self.vipImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.mas_top).offset(2);
make.centerX.equalTo(self);
make.width.mas_equalTo(217);
make.height.mas_equalTo(166);
}];
// 主标题
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.vipImageView.mas_bottom).offset(28);
make.centerX.equalTo(self);
make.left.greaterThanOrEqualTo(self.mas_left).offset(16);
make.right.lessThanOrEqualTo(self.mas_right).offset(-16);
make.height.mas_equalTo(26);
}];
// 副标题
[self.subTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.titleLabel.mas_bottom).offset(3);
make.centerX.equalTo(self.titleLabel);
make.left.greaterThanOrEqualTo(self.mas_left).offset(16);
make.right.lessThanOrEqualTo(self.mas_right).offset(-16);
make.height.mas_equalTo(20);
}];
// 功能按钮容器
[self.featuresContainer mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.subTitleLabel.mas_bottom).offset(16);
make.left.equalTo(self.mas_left).offset(16);
make.right.equalTo(self.mas_right).offset(-16);
make.height.mas_equalTo(94);
}];
// 四个按钮等宽分布
KBTopImageButton *b0 = self.featureButtons[0];
KBTopImageButton *b1 = self.featureButtons[1];
KBTopImageButton *b2 = self.featureButtons[2];
KBTopImageButton *b3 = self.featureButtons[3];
[b0 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.top.bottom.equalTo(self.featuresContainer);
}];
[b1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(b0.mas_right);
make.top.bottom.equalTo(b0);
make.width.equalTo(b0);
}];
[b2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(b1.mas_right);
make.top.bottom.equalTo(b0);
make.width.equalTo(b0);
}];
[b3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(b2.mas_right);
make.top.bottom.right.equalTo(self.featuresContainer);
make.width.equalTo(b0);
}];
// 购买按钮
[self.buyButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.mas_left).offset(62);
make.right.equalTo(self.mas_right).offset(-62);
make.bottom.equalTo(self.mas_bottom).offset(-5);
make.height.mas_equalTo(56);
}];
}
- (void)defaultData {
// 默认文案(使用英文,便于与示例图一致)
self.titleLabel.text = @"Become A Member Of Love Key";
self.subTitleLabel.text = @"Unlock All Functions";
NSArray *titles = @[@"Wireless Sub-ai\nDialogue",
@"Personalized\nKeyboard",
@"Chat\nPersona",
@"Emotional\nCounseling"];
[self configureFeatureTitles:titles images:nil];
}
#pragma mark - Public
- (void)configureFeatureTitles:(NSArray<NSString *> *)titles images:(NSArray<UIImage *> *)images {
// 设置四个按钮标题与占位图片(如未传图片则生成渐变圆角占位)
NSInteger count = MIN(4, titles.count);
for (NSInteger i = 0; i < 4; i++) {
KBTopImageButton *btn = self.featureButtons[i];
if (i < count) {
btn.textLabel.text = titles[i];
}
UIImage *img = (i < images.count) ? images[i] : nil;
if (!img) {
// 生成一张柔和的渐变占位图
CGSize s = btn.iconSize;
CGFloat cr = MIN(s.width, s.height) * 0.26;
UIColor *c1 = [UIColor colorWithHex:0xC9F7E9];
UIColor *c2 = [UIColor colorWithHex:0xA6E6FF];
if (i == 1) { c1 = [UIColor colorWithHex:0xD7E5FF]; c2 = [UIColor colorWithHex:0xBFD2FF]; }
if (i == 2) { c1 = [UIColor colorWithHex:0xEBD8FF]; c2 = [UIColor colorWithHex:0xDDBBFF]; }
if (i == 3) { c1 = [UIColor colorWithHex:0xD1F5DE]; c2 = [UIColor colorWithHex:0xB6EBCE]; }
img = [UIImage kb_gradientImageWithColors:@[c1, c2]
locations:nil
size:s
direction:KBGradientDirectionLeftTopToRightBottom
cornerRadius:cr];
}
btn.iconView.image = img;
}
}
#pragma mark - Actions
- (void)onTapBuyAction {
if (self.onTapBuy) { self.onTapBuy(); }
}
#pragma mark - Lazy
- (UIImageView *)vipImageView{
if (!_vipImageView) {
_vipImageView = [[UIImageView alloc] init];
_vipImageView.image = [UIImage imageNamed:@"home_vip_card"];
_vipImageView.contentMode = UIViewContentModeScaleAspectFit;
_vipImageView.backgroundColor = [UIColor redColor];
}
return _vipImageView;
}
- (UILabel *)titleLabel {
if (!_titleLabel) {
_titleLabel = [[UILabel alloc] init];
_titleLabel.font = [UIFont systemFontOfSize:18 weight:UIFontWeightBold];
_titleLabel.textColor = [UIColor colorWithHex:0x1B1F1A];
_titleLabel.textAlignment = NSTextAlignmentCenter;
}
return _titleLabel;
}
- (UILabel *)subTitleLabel {
if (!_subTitleLabel) {
_subTitleLabel = [[UILabel alloc] init];
_subTitleLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightRegular];
_subTitleLabel.textColor = self.titleLabel.textColor;
_subTitleLabel.textAlignment = NSTextAlignmentCenter;
}
return _subTitleLabel;
}
- (UIView *)featuresContainer {
if (!_featuresContainer) {
_featuresContainer = [[UIView alloc] init];
// 不显式背景,保留父视图背景;如需调试可设置颜色
// _featuresContainer.backgroundColor = [UIColor colorWithWhite:0 alpha:0.02];
// 创建4个功能按钮懒加载一并放到数组
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:4];
for (int i = 0; i < 4; i++) {
KBTopImageButton *btn = [[KBTopImageButton alloc] init];
btn.iconSize = CGSizeMake(46, 46);
btn.spacing = 5;
[self.featuresContainer addSubview:btn];
[arr addObject:btn];
}
_featureButtons = [arr copy];
}
return _featuresContainer;
}
- (NSArray<KBTopImageButton *> *)featureButtons {
// 只读访问,实际由 featuresContainer 的懒加载创建
if (!_featureButtons) { (void)self.featuresContainer; }
return _featureButtons;
}
- (UIButton *)buyButton {
if (!_buyButton) {
_buyButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_buyButton setTitle:@"Recharge Now" forState:UIControlStateNormal];
[_buyButton setTitleColor:[UIColor colorWithHex:0x1B1F1A] forState:UIControlStateNormal];
_buyButton.titleLabel.font = [UIFont systemFontOfSize:15 weight:UIFontWeightMedium];
[_buyButton addTarget:self action:@selector(onTapBuyAction) forControlEvents:UIControlEventTouchUpInside];
}
return _buyButton;
}
@end