// // KBShopHeadView.m // keyBoard // // Created by Mac on 2025/11/9. // #import "KBShopHeadView.h" #import "KBJfPay.h" @interface KBShopHeadView () // 容器视图(留出与屏幕的左右边距) @property (nonatomic, strong) UIView *containerView; // 顶部左侧标题与点缀 @property (nonatomic, strong) UILabel *titleLabel; // "Points\nMall" @property (nonatomic, strong) UIImageView *yellowStarView; // 左侧黄色装饰星:shop_yellowxx_icon @property (nonatomic, strong) UIImageView *yellowStarView2; // 左侧黄色装饰星:shop_yellowxx_icon @property (nonatomic, strong) UIImageView *greenStarView; // 右上角绿色装饰星:shop_greenxx_icon @property (nonatomic, strong) UIImageView *greenStarView2; // 右上角绿色装饰星:shop_greenxx_icon @property (nonatomic, strong) UIImageView *greenStarView3; // 右上角绿色装饰星:shop_greenxx_icon // 右侧大金币 @property (nonatomic, strong) UIImageView *bigCoinView; // shop_headbigBg_icon // 底部信息卡片 @property (nonatomic, strong) UIView *infoCard; // 渐变浅绿背景 @property (nonatomic, strong) UILabel *myPointsLabel; // "My Points" @property (nonatomic, strong) UIImageView *smallCoinView; // 左侧小金币:shop_jb_icon @property (nonatomic, strong) UILabel *amountLabel; // 数字 88.00 @property (nonatomic, strong) UIButton *rechargeButton; // 充值按钮:recharge_btn_bg @end @implementation KBShopHeadView - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.backgroundColor = [UIColor clearColor]; // 组装视图层级 [self addSubview:self.containerView]; [self.containerView addSubview:self.titleLabel]; [self.containerView addSubview:self.bigCoinView]; [self.containerView addSubview:self.yellowStarView]; [self.containerView addSubview:self.yellowStarView2]; [self.containerView addSubview:self.greenStarView]; [self.containerView addSubview:self.greenStarView2]; [self.containerView addSubview:self.greenStarView3]; [self.containerView addSubview:self.infoCard]; [self.infoCard addSubview:self.myPointsLabel]; [self.infoCard addSubview:self.smallCoinView]; [self.infoCard addSubview:self.amountLabel]; [self.infoCard addSubview:self.rechargeButton]; // 布局 [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self).offset(16); make.right.equalTo(self).offset(-16); make.top.equalTo(self); make.bottom.equalTo(self); }]; // 左侧标题 [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.containerView).offset(32); make.top.equalTo(self.containerView).offset(KB_NAV_TOTAL_HEIGHT + 20); }]; // 左侧黄色装饰星 [self.yellowStarView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(self.titleLabel.mas_centerY).offset(6); make.left.equalTo(self.containerView).offset(6); make.width.height.mas_equalTo(18); }]; [self.yellowStarView2 mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(self.titleLabel.mas_top).offset(6); make.left.equalTo(self.titleLabel.mas_right).offset(6); make.width.height.mas_equalTo(16); }]; // 右上角绿色装饰星 [self.greenStarView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.yellowStarView2).offset(0); make.left.equalTo(self.yellowStarView2.mas_right).offset(62); make.width.height.mas_equalTo(20); }]; [self.greenStarView2 mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.greenStarView.mas_bottom).offset(10); make.right.equalTo(self.containerView).offset(-18); make.width.height.mas_equalTo(14); }]; [self.greenStarView3 mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.greenStarView2.mas_bottom).offset(20); make.right.equalTo(self.containerView).offset(0); make.width.height.mas_equalTo(14); }]; // 右侧大金币(装饰) [self.bigCoinView mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(self.containerView); make.left.right.equalTo(self.containerView); make.height.mas_equalTo(KBFit(238)); }]; // 底部信息卡片 [self.infoCard mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.equalTo(self.containerView); make.bottom.equalTo(self.containerView); make.height.mas_equalTo(KBFit(140)); }]; [self.myPointsLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.infoCard).offset(16); make.bottom.equalTo(self.smallCoinView.mas_top).offset(-16); }]; [self.smallCoinView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.infoCard).offset(16); make.centerY.equalTo(self.amountLabel); make.width.height.mas_equalTo(38); }]; [self.amountLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.smallCoinView.mas_right).offset(10); make.centerY.equalTo(self.rechargeButton); }]; [self.rechargeButton mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(self.infoCard).offset(-32); make.right.equalTo(self.infoCard).offset(-15); make.width.mas_equalTo(114); make.height.mas_equalTo(42); }]; } return self; } - (void)layoutSubviews { [super layoutSubviews]; // 圆角;头图容器做裁剪,避免内容溢出 // self.containerView.layer.cornerRadius = 16.0; // self.containerView.layer.masksToBounds = YES; // // self.infoCard.layer.cornerRadius = 16.0; // self.infoCard.layer.masksToBounds = YES; // // // 卡片底色做一个很浅的左→右渐变,贴近设计微绿色 // // 先移除已有渐变,避免多次叠加 // NSMutableArray *remove = [NSMutableArray array]; // for (CALayer *l in self.infoCard.layer.sublayers) { // if ([l isKindOfClass:[CAGradientLayer class]]) { [remove addObject:l]; } // } // for (CALayer *l in remove) { [l removeFromSuperlayer]; } // // CAGradientLayer *g = [CAGradientLayer layer]; // g.colors = @[(__bridge id)[UIColor colorWithHex:0xF4FFFE].CGColor, // (__bridge id)[UIColor colorWithHex:0xE8FFF6].CGColor]; // g.startPoint = CGPointMake(0, 0.5); // g.endPoint = CGPointMake(1, 0.5); // g.frame = self.infoCard.bounds; // [self.infoCard.layer insertSublayer:g atIndex:0]; } #pragma mark - Public - (void)updatePoints:(NSString *)points { if (points.length == 0) { points = @"0"; } self.amountLabel.text = points; } #pragma mark - Actions - (void)onRechargeTappedAction { // if (self.onRechargeTapped) { self.onRechargeTapped(); } KBJfPay *vc = [[KBJfPay alloc] init]; [KB_CURRENT_NAV pushViewController:vc animated:true]; } #pragma mark - Lazy UI - (UIView *)containerView { if (!_containerView) { _containerView = [UIView new]; // _containerView.backgroundColor = [UIColor whiteColor]; } return _containerView; } - (UILabel *)titleLabel { if (!_titleLabel) { _titleLabel = [UILabel new]; _titleLabel.numberOfLines = 0; _titleLabel.text = @"Points\nMall"; // 两行展示 _titleLabel.font = [UIFont systemFontOfSize:30 weight:UIFontWeightBold]; _titleLabel.textColor = [UIColor colorWithHex:0x1B1F1A]; } return _titleLabel; } - (UIImageView *)yellowStarView { if (!_yellowStarView) { _yellowStarView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"shop_yellowxx_icon"]]; _yellowStarView.contentMode = UIViewContentModeScaleAspectFit; } return _yellowStarView; } - (UIImageView *)yellowStarView2 { if (!_yellowStarView2) { _yellowStarView2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"shop_yellowxx_icon"]]; _yellowStarView2.contentMode = UIViewContentModeScaleAspectFit; } return _yellowStarView2; } - (UIImageView *)greenStarView { if (!_greenStarView) { _greenStarView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"shop_greenxx_icon"]]; _greenStarView.contentMode = UIViewContentModeScaleAspectFit; } return _greenStarView; } - (UIImageView *)greenStarView2 { if (!_greenStarView2) { _greenStarView2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"shop_greenxx_icon"]]; _greenStarView2.contentMode = UIViewContentModeScaleAspectFit; } return _greenStarView2; } - (UIImageView *)greenStarView3 { if (!_greenStarView3) { _greenStarView3 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"shop_greenxx_icon"]]; _greenStarView3.contentMode = UIViewContentModeScaleAspectFit; } return _greenStarView3; } - (UIImageView *)bigCoinView { if (!_bigCoinView) { _bigCoinView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"shop_headbigBg_icon"]]; _bigCoinView.contentMode = UIViewContentModeScaleAspectFit; } return _bigCoinView; } - (UIView *)infoCard { if (!_infoCard) { _infoCard = [UIView new]; } return _infoCard; } - (UILabel *)myPointsLabel { if (!_myPointsLabel) { _myPointsLabel = [UILabel new]; _myPointsLabel.text = @"My Points"; _myPointsLabel.textColor = [UIColor colorWithHex:KBBlackValue]; _myPointsLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightSemibold]; } return _myPointsLabel; } - (UIImageView *)smallCoinView { if (!_smallCoinView) { _smallCoinView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"shop_jb_icon"]]; _smallCoinView.contentMode = UIViewContentModeScaleAspectFit; } return _smallCoinView; } - (UILabel *)amountLabel { if (!_amountLabel) { _amountLabel = [UILabel new]; _amountLabel.text = @"88.00"; _amountLabel.textColor = [UIColor colorWithHex:KBColorValue]; _amountLabel.font = [UIFont systemFontOfSize:40 weight:UIFontWeightBold]; _amountLabel.adjustsFontSizeToFitWidth = YES; // _amountLabel.minimumScaleFactor = 0.7; } return _amountLabel; } - (UIButton *)rechargeButton { if (!_rechargeButton) { _rechargeButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_rechargeButton setTitle:@"Recharge" forState:UIControlStateNormal]; [_rechargeButton setTitleColor:[UIColor colorWithHex:KBBlackValue] forState:UIControlStateNormal]; _rechargeButton.titleLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightSemibold]; UIImage *bg = [UIImage imageNamed:@"recharge_btn_bg"]; [_rechargeButton setBackgroundImage:bg forState:UIControlStateNormal]; // // // 切图背景图(可拉伸) // UIImage *bg = [UIImage imageNamed:@"recharge_btn_bg"]; // if (bg) { // CGFloat cap = 20; // 圆角拉伸区域 // bg = [bg resizableImageWithCapInsets:UIEdgeInsetsMake(cap, cap, cap, cap) resizingMode:UIImageResizingModeStretch]; // [_rechargeButton setBackgroundImage:bg forState:UIControlStateNormal]; // } else { // // 兜底:用绿色渐变生成 // UIImage *fallback = [UIImage kb_gradientImageWithColors:@[[UIColor colorWithHex:0xA6F6E9], [UIColor colorWithHex:0xD6FFF4]] // size:CGSizeMake(120, 40) // direction:KBGradientDirectionLeftToRight]; // [_rechargeButton setBackgroundImage:fallback forState:UIControlStateNormal]; // } // // _rechargeButton.layer.cornerRadius = 20; // _rechargeButton.layer.masksToBounds = YES; [_rechargeButton addTarget:self action:@selector(onRechargeTappedAction) forControlEvents:UIControlEventTouchUpInside]; } return _rechargeButton; } @end