From 6a5bda44e61164fb28568da1e0e653803d044aa1 Mon Sep 17 00:00:00 2001 From: CodeST <694468528@qq.com> Date: Thu, 11 Dec 2025 22:02:18 +0800 Subject: [PATCH] 1 --- .../My/my_vip_icon.imageset/Contents.json | 22 ++++ .../my_vip_icon.imageset/my_vip_icon@2x.png | Bin 0 -> 5725 bytes .../my_vip_icon.imageset/my_vip_icon@3x.png | Bin 0 -> 11771 bytes keyBoard/Class/Login/M/KBUser.h | 5 +- keyBoard/Class/Me/V/KBMyHeaderView.m | 105 +++++++++++++++++- 5 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 keyBoard/Assets.xcassets/My/my_vip_icon.imageset/Contents.json create mode 100644 keyBoard/Assets.xcassets/My/my_vip_icon.imageset/my_vip_icon@2x.png create mode 100644 keyBoard/Assets.xcassets/My/my_vip_icon.imageset/my_vip_icon@3x.png diff --git a/keyBoard/Assets.xcassets/My/my_vip_icon.imageset/Contents.json b/keyBoard/Assets.xcassets/My/my_vip_icon.imageset/Contents.json new file mode 100644 index 0000000..ea7c6de --- /dev/null +++ b/keyBoard/Assets.xcassets/My/my_vip_icon.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "my_vip_icon@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "my_vip_icon@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/keyBoard/Assets.xcassets/My/my_vip_icon.imageset/my_vip_icon@2x.png b/keyBoard/Assets.xcassets/My/my_vip_icon.imageset/my_vip_icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2f9920e70f715b74ecbfe4503289f75a1c9951 GIT binary patch literal 5725 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 P00000NkvXXu0mjf^kEHf literal 0 HcmV?d00001 diff --git a/keyBoard/Assets.xcassets/My/my_vip_icon.imageset/my_vip_icon@3x.png b/keyBoard/Assets.xcassets/My/my_vip_icon.imageset/my_vip_icon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd88f96572eebb43289d3c56e88042ca470783f GIT binary patch literal 11771 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 dNkl*D|b literal 0 HcmV?d00001 diff --git a/keyBoard/Class/Login/M/KBUser.h b/keyBoard/Class/Login/M/KBUser.h index f76cc93..2849ed9 100644 --- a/keyBoard/Class/Login/M/KBUser.h +++ b/keyBoard/Class/Login/M/KBUser.h @@ -23,6 +23,10 @@ typedef NS_ENUM(NSInteger, UserSex) { @property (nonatomic, copy, nullable) NSString *email; /// 邮箱是否验证 @property (nonatomic, assign) BOOL emailVerified; +/// VIP 到期日(yyyy-MM-dd) +@property (nonatomic, copy, nullable) NSString *vipExpiry; +/// 是否是 VIP +@property (nonatomic, assign) BOOL isVip; // token @property (nonatomic, copy, nullable) NSString *token; // token/access_token/accessToken @@ -30,4 +34,3 @@ typedef NS_ENUM(NSInteger, UserSex) { @end NS_ASSUME_NONNULL_END - diff --git a/keyBoard/Class/Me/V/KBMyHeaderView.m b/keyBoard/Class/Me/V/KBMyHeaderView.m index da8673d..2f75ade 100644 --- a/keyBoard/Class/Me/V/KBMyHeaderView.m +++ b/keyBoard/Class/Me/V/KBMyHeaderView.m @@ -18,10 +18,15 @@ @property (nonatomic, strong) UIButton *keyboardBtn; @property (nonatomic, strong) UIImageView *avatarView; @property (nonatomic, strong) UILabel *nameLabel; +@property (nonatomic, strong) UIImageView *vipIconView; +@property (nonatomic, strong) UILabel *vipExpiryLabel; @property (nonatomic, strong) UIImageView *cardLeft; @property (nonatomic, strong) UIImageView *cardRight; @property (nonatomic, strong) UIImageView *avatarEditIcon; // 头像右下角的编辑图标 @property (nonatomic, strong) KBUser *userModel; +//@property (nonatomic, strong) MASConstraint *vipIconWidthConstraint; +//@property (nonatomic, strong) MASConstraint *nameRightToVipConstraint; +//@property (nonatomic, strong) MASConstraint *nameRightToSuperviewConstraint; @end @@ -36,6 +41,8 @@ [self addSubview:self.avatarView]; [self addSubview:self.avatarEditIcon]; // 头像右下角编辑图标 [self addSubview:self.nameLabel]; + [self addSubview:self.vipIconView]; + [self addSubview:self.vipExpiryLabel]; [self addSubview:self.cardLeft]; [self addSubview:self.cardRight]; @@ -61,10 +68,30 @@ make.bottom.equalTo(self.avatarView.mas_bottom); }]; [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.avatarView.mas_right).offset(16); make.centerY.equalTo(self.avatarView); - make.left.equalTo(self.avatarView.mas_right).offset(12); - make.right.lessThanOrEqualTo(self).offset(-20); }]; + + [self.vipIconView mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.nameLabel); + make.left.equalTo(self.nameLabel.mas_right).offset(10); + make.right.lessThanOrEqualTo(self).offset(-16); + make.width.mas_equalTo(51); + make.height.mas_equalTo(20); + }]; + + [self.vipExpiryLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.nameLabel.mas_bottom).offset(6); + make.left.equalTo(self.nameLabel); + make.right.lessThanOrEqualTo(self).offset(-16); + }]; + + [self.nameLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow + forAxis:UILayoutConstraintAxisHorizontal]; + [self.vipIconView setContentCompressionResistancePriority:UILayoutPriorityRequired + forAxis:UILayoutConstraintAxisHorizontal]; + + // 166 99 // w ? CGFloat height = 99 * (KB_SCREEN_WIDTH - 2 * 16 - 10) * 0.5 / 166; @@ -102,6 +129,31 @@ // 头像:使用通用占位图 [self.avatarView kb_setAvatarURL:user.avatarUrl placeholder:KBPlaceholderImage]; + + BOOL isVip = user.isVip; + self.vipIconView.hidden = !isVip; + self.vipExpiryLabel.hidden = !isVip; + self.vipExpiryLabel.text = isVip ? [self vipExpiryDisplayTextFrom:user.vipExpiry] : nil; +} + +- (NSString *)vipExpiryDisplayTextFrom:(NSString *)rawDate { + NSString *prefix = KBLocalized(@"Due On"); + if (rawDate.length == 0) { + return prefix; + } + + NSDateFormatter *input = [self.class vipExpiryInputFormatter]; + NSDate *date = [input dateFromString:rawDate]; + if (!date) { + return [NSString stringWithFormat:@"%@ %@", prefix, rawDate]; + } + + NSDateFormatter *output = [self.class vipExpiryOutputFormatter]; + NSString *formatted = [output stringFromDate:date]; + if (formatted.length == 0) { + formatted = rawDate; + } + return [NSString stringWithFormat:@"%@ %@", prefix, formatted]; } + (void)kb_applyGradientTo:(UIView *)view colors:(NSArray *)colors { @@ -120,6 +172,28 @@ [view.layer insertSublayer:g atIndex:0]; } ++ (NSDateFormatter *)vipExpiryInputFormatter { + static NSDateFormatter *formatter; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + formatter = [NSDateFormatter new]; + formatter.dateFormat = @"yyyy-MM-dd"; + formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; + }); + return formatter; +} + ++ (NSDateFormatter *)vipExpiryOutputFormatter { + static NSDateFormatter *formatter; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + formatter = [NSDateFormatter new]; + formatter.dateStyle = NSDateFormatterLongStyle; + formatter.timeStyle = NSDateFormatterNoStyle; + }); + return formatter; +} + #pragma mark - Lazy UI - (UILabel *)titleLabel { if (!_titleLabel) { @@ -183,10 +257,37 @@ _nameLabel.text = @"Notice"; _nameLabel.font = [KBFont medium:20]; _nameLabel.textColor = [UIColor colorWithHex:KBBlackValue]; + _nameLabel.lineBreakMode = NSLineBreakByTruncatingTail; + [_nameLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal]; + [_nameLabel setContentHuggingPriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal]; } return _nameLabel; } +- (UIImageView *)vipIconView { + if (!_vipIconView) { + _vipIconView = [UIImageView new]; + _vipIconView.contentMode = UIViewContentModeScaleAspectFit; + _vipIconView.image = [UIImage imageNamed:@"my_vip_icon"]; + _vipIconView.hidden = YES; + [_vipIconView setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; + [_vipIconView setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; + } + return _vipIconView; +} + +- (UILabel *)vipExpiryLabel { + if (!_vipExpiryLabel) { + _vipExpiryLabel = [UILabel new]; + _vipExpiryLabel.font = [KBFont regular:12]; + _vipExpiryLabel.textColor = [UIColor colorWithHex:0x9FA5B5]; + _vipExpiryLabel.numberOfLines = 1; + _vipExpiryLabel.lineBreakMode = NSLineBreakByTruncatingTail; + _vipExpiryLabel.hidden = YES; + } + return _vipExpiryLabel; +} + - (UIImageView *)cardLeft { if (!_cardLeft) { _cardLeft = [UIImageView new];