Files
keyboard/keyBoard/Class/Home/V/KBTopThreeView.m
2025-11-07 19:33:54 +08:00

212 lines
6.8 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.

//
// KBTopThreeView.m
// keyBoard
//
#import "KBTopThreeView.h"
@interface KBTopThreeCardView : UIView
/// 头像占位(圆形描边)
@property (nonatomic, strong) UIView *avatarCircleView;
/// 彩条卡片背景
@property (nonatomic, strong) UIImageView *cardImageView;
/// 标题
@property (nonatomic, strong) UILabel *titleLabel;
/// 底部加号按钮
@property (nonatomic, strong) UIButton *plusButton;
/// 渲染
- (void)renderWithTitle:(NSString *)title rank:(NSInteger)rank;
@end
@implementation KBTopThreeCardView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self setupUI];
}
return self;
}
- (void)setupUI {
// 卡片
[self addSubview:self.cardImageView];
// 头像圆圈
[self addSubview:self.avatarCircleView];
[self.cardImageView addSubview:self.titleLabel];
// 加号按钮
[self addSubview:self.plusButton];
// 布局
[self.avatarCircleView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self);
make.centerX.equalTo(self);
make.width.height.mas_equalTo(68);
}];
[self.cardImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.avatarCircleView.mas_bottom).offset(-34); // 顶部悬浮重叠
make.left.right.equalTo(self);
make.height.mas_equalTo(148);
}];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.cardImageView);
make.top.equalTo(self.cardImageView).offset(84);
}];
[self.plusButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.cardImageView.mas_bottom).offset(12);
make.centerX.equalTo(self);
make.width.mas_equalTo(52);
make.height.mas_equalTo(28);
make.bottom.equalTo(self.mas_bottom); // 由外部控制总体高度
}];
}
- (void)renderWithTitle:(NSString *)title rank:(NSInteger)rank {
self.titleLabel.text = title.length ? title : @"";
// 不同名次数的配色
UIColor *theme;
UIImage *image;
switch (rank) {
case 1:
{
theme = [UIColor colorWithRed:1.00 green:0.86 blue:0.43 alpha:1.0];
image = [UIImage imageNamed:@"home_rank_1"];
}
break; // 金
case 2: {
theme = [UIColor colorWithRed:0.68 green:0.80 blue:1.00 alpha:1.0];
image = [UIImage imageNamed:@"home_rank_2"];
}
break; // 蓝
default: {
theme = [UIColor colorWithRed:1.00 green:0.78 blue:0.63 alpha:1.0];
image = [UIImage imageNamed:@"home_rank_3"];
} break; // 橙
}
self.cardImageView.image = image;
self.plusButton.backgroundColor = [theme colorWithAlphaComponent:0.3];
// 圆圈描边
self.avatarCircleView.layer.borderColor = [UIColor colorWithRed:0.83 green:0.95 blue:0.27 alpha:1.0].CGColor;
}
#pragma mark - Lazy
- (UIView *)avatarCircleView {
if (!_avatarCircleView) {
_avatarCircleView = [[UIView alloc] init];
_avatarCircleView.backgroundColor = [UIColor whiteColor];
_avatarCircleView.layer.cornerRadius = 34;
_avatarCircleView.layer.borderWidth = 2.0;
_avatarCircleView.layer.borderColor = [UIColor colorWithWhite:0.9 alpha:1].CGColor;
// 可在此加入头像 UIImageView
}
return _avatarCircleView;
}
- (UIImageView *)cardImageView {
if (!_cardImageView) {
_cardImageView = [[UIImageView alloc] init];
}
return _cardImageView;
}
- (UILabel *)titleLabel {
if (!_titleLabel) {
_titleLabel = [[UILabel alloc] init];
_titleLabel.textColor = [UIColor colorWithWhite:0.1 alpha:1];
_titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold];
_titleLabel.textAlignment = NSTextAlignmentCenter;
}
return _titleLabel;
}
- (UIButton *)plusButton {
if (!_plusButton) {
_plusButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_plusButton setTitle:@"+" forState:UIControlStateNormal];
[_plusButton setTitleColor:[UIColor colorWithRed:0.20 green:0.65 blue:0.50 alpha:1.0] forState:UIControlStateNormal];
_plusButton.titleLabel.font = [UIFont systemFontOfSize:18 weight:UIFontWeightSemibold];
_plusButton.layer.cornerRadius = 14.0;
_plusButton.layer.masksToBounds = YES;
}
return _plusButton;
}
@end
@interface KBTopThreeView()
@property (nonatomic, strong) KBTopThreeCardView *leftCard;
@property (nonatomic, strong) KBTopThreeCardView *centerCard;
@property (nonatomic, strong) KBTopThreeCardView *rightCard;
@end
@implementation KBTopThreeView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor whiteColor];
[self setupUI];
}
return self;
}
- (void)setupUI {
[self addSubview:self.leftCard];
[self addSubview:self.centerCard];
[self addSubview:self.rightCard];
// 横向均分布局
[self.centerCard mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self);
make.top.equalTo(self).offset(8);
make.width.equalTo(self.mas_width).multipliedBy(1.0/3.0).offset(-12);
}];
[self.leftCard mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.centerCard);
make.right.equalTo(self.centerCard.mas_left).offset(-8);
make.width.equalTo(self.centerCard);
}];
[self.rightCard mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.centerCard);
make.left.equalTo(self.centerCard.mas_right).offset(8);
make.width.equalTo(self.centerCard);
}];
// 让最右/最左卡片对齐底部,撑起本视图
[self.leftCard mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(self).offset(-8); }];
[self.rightCard mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(self).offset(-8); }];
}
- (void)configWithItems:(NSArray<NSDictionary *> *)items {
// items 顺序任意,这里按 rank 分配1 放中间2 左3 右
NSString *t1 = @"", *t2 = @"", *t3 = @"";
for (NSDictionary *d in items) {
NSInteger r = [d[@"rank"] integerValue];
NSString *title = d[@"title"] ?: @"";
if (r == 1) t1 = title;
else if (r == 2) t2 = title;
else if (r == 3) t3 = title;
}
[self.centerCard renderWithTitle:t1 rank:1];
[self.leftCard renderWithTitle:t2 rank:2];
[self.rightCard renderWithTitle:t3 rank:3];
}
#pragma mark - Lazy
- (KBTopThreeCardView *)leftCard { if (!_leftCard) _leftCard = [KBTopThreeCardView new]; return _leftCard; }
- (KBTopThreeCardView *)centerCard { if (!_centerCard) _centerCard = [KBTopThreeCardView new]; return _centerCard; }
- (KBTopThreeCardView *)rightCard { if (!_rightCard) _rightCard = [KBTopThreeCardView new]; return _rightCard; }
@end