// // KBAppUpdateView.m // keyBoard // #import "KBAppUpdateView.h" #import "KBLoginVM.h" @interface KBAppUpdateView () @property (nonatomic, strong) UIImageView *backgroundImageView; @property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, strong) UIView *versionBadgeView; @property (nonatomic, strong) UILabel *versionLabel; @property (nonatomic, strong) UILabel *contentTitleLabel; @property (nonatomic, strong) UIScrollView *contentScrollView; @property (nonatomic, strong) UILabel *contentLabel; @property (nonatomic, strong) UIButton *upgradeButton; @property (nonatomic, strong) UIButton *cancelButton; @end @implementation KBAppUpdateView - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { self.backgroundColor = [UIColor clearColor]; self.layer.cornerRadius = KBFit(22.0); self.layer.masksToBounds = YES; [self setupUI]; [self setupConstraints]; [self applyDefaultTexts]; } return self; } - (instancetype)initWithCoder:(NSCoder *)coder { if (self = [super initWithCoder:coder]) { self.backgroundColor = [UIColor whiteColor]; self.layer.cornerRadius = KBFit(22.0); self.layer.masksToBounds = YES; [self setupUI]; [self setupConstraints]; [self applyDefaultTexts]; } return self; } #pragma mark - Setup - (void)setupUI { [self addSubview:self.backgroundImageView]; [self addSubview:self.titleLabel]; [self addSubview:self.versionBadgeView]; [self.versionBadgeView addSubview:self.versionLabel]; [self addSubview:self.contentTitleLabel]; [self addSubview:self.contentScrollView]; [self.contentScrollView addSubview:self.contentLabel]; [self addSubview:self.cancelButton]; [self addSubview:self.upgradeButton]; } - (void)setupConstraints { [self.backgroundImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self); }]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self).offset(KBFit(45.0)); make.top.equalTo(self).offset(KBFit(70.0)); make.right.lessThanOrEqualTo(self).offset(-KBFit(24.0)); }]; [self.versionBadgeView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self).offset(KBFit(18)); make.top.equalTo(self).offset(KBFit(120.0)); make.width.mas_equalTo(KBFit(73.0)); make.height.mas_equalTo(KBFit(23.0)); }]; [self.versionLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.versionBadgeView); }]; [self.contentTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.versionBadgeView); make.top.equalTo(self.versionBadgeView.mas_bottom).offset(KBFit(15)); make.right.lessThanOrEqualTo(self).offset(-KBFit(20.0)); }]; [self.contentScrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.contentTitleLabel); make.top.equalTo(self.contentTitleLabel.mas_bottom).offset(KBFit(8.0)); make.right.equalTo(self).offset(-KBFit(24)); make.bottom.equalTo(self.upgradeButton.mas_top).offset(-KBFit(16.0)); }]; [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.contentScrollView); make.width.equalTo(self.contentScrollView); }]; [self kb_updateButtonsLayout]; } - (void)applyDefaultTexts { self.titleText = KBLocalized(@""); self.versionText = @"V1.1.4"; self.contentTitleText = KBLocalized(@"Ver. Update Content"); self.contentItems = @[ KBLocalized(@"AAAAAAAAAAAAAAAAAAA"), KBLocalized(@"SSSSSSSSSSSSSSSSSSS") ]; self.upgradeButtonTitle = KBLocalized(@"立即升级"); self.cancelButtonTitle = KBLocalized(@"取消"); self.showsCancelButton = NO; } #pragma mark - Actions - (void)onTapUpgrade { if ([self.delegate respondsToSelector:@selector(appUpdateViewDidTapUpgrade:)]) { [self.delegate appUpdateViewDidTapUpgrade:self]; } } - (void)onTapCancel { if ([self.delegate respondsToSelector:@selector(appUpdateViewDidTapCancel:)]) { [self.delegate appUpdateViewDidTapCancel:self]; } } #pragma mark - Setters - (void)setBackgroundImageName:(NSString *)backgroundImageName { _backgroundImageName = [backgroundImageName copy]; if (_backgroundImageName.length > 0) { self.backgroundImageView.image = [UIImage imageNamed:_backgroundImageName]; } else { self.backgroundImageView.image = nil; } } - (void)setTitleText:(NSString *)titleText { _titleText = [titleText copy]; self.titleLabel.text = _titleText; } - (void)setVersionText:(NSString *)versionText { _versionText = [versionText copy]; self.versionLabel.text = _versionText; } - (void)setContentTitleText:(NSString *)contentTitleText { _contentTitleText = [contentTitleText copy]; self.contentTitleLabel.text = _contentTitleText; } - (void)setContentItems:(NSArray *)contentItems { _contentItems = [contentItems copy]; self.contentLabel.text = [self formattedContentItems:_contentItems]; } - (void)setUpgradeButtonTitle:(NSString *)upgradeButtonTitle { _upgradeButtonTitle = [upgradeButtonTitle copy]; [self.upgradeButton setTitle:_upgradeButtonTitle forState:UIControlStateNormal]; } - (void)setCancelButtonTitle:(NSString *)cancelButtonTitle { _cancelButtonTitle = [cancelButtonTitle copy]; [self.cancelButton setTitle:_cancelButtonTitle forState:UIControlStateNormal]; } - (void)setShowsCancelButton:(BOOL)showsCancelButton { _showsCancelButton = showsCancelButton; [self kb_updateButtonsLayout]; } - (void)setUpdateInfo:(KBAppUpdateInfo *)updateInfo { _updateInfo = updateInfo; if (!updateInfo) { return; } self.showsCancelButton = !updateInfo.forceUpdate; if (!updateInfo.forceUpdate) { self.cancelButtonTitle = KBLocalized(@"取消"); } self.upgradeButtonTitle = KBLocalized(@"更新"); self.contentTitleText = KBLocalized(@"更新内容"); NSString *versionName = updateInfo.latestVersionName ?: @""; if (versionName.length > 0 && ![versionName hasPrefix:@"V"] && ![versionName hasPrefix:@"v"]) { versionName = [NSString stringWithFormat:@"V%@", versionName]; } self.versionText = versionName ?: @""; NSArray *items = [self kb_contentItemsFromText:updateInfo.releaseNotes]; self.contentItems = items; } #pragma mark - Helpers - (NSString *)formattedContentItems:(NSArray *)items { if (items.count == 0) { return @""; } NSMutableArray *lines = [NSMutableArray array]; [items enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL *stop) { if (![obj isKindOfClass:[NSString class]] || obj.length == 0) { return; } NSString *line = [NSString stringWithFormat:@"%lu、%@", (unsigned long)(idx + 1), obj]; [lines addObject:line]; }]; return [lines componentsJoinedByString:@"\n"]; } - (NSArray *)kb_contentItemsFromText:(nullable NSString *)text { if (![text isKindOfClass:NSString.class]) { return @[]; } NSString *trimmed = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; if (trimmed.length == 0) { return @[]; } NSCharacterSet *splitSet = [NSCharacterSet characterSetWithCharactersInString:@"\n;"]; NSArray *parts = [trimmed componentsSeparatedByCharactersInSet:splitSet]; NSMutableArray *items = [NSMutableArray array]; for (NSString *part in parts) { NSString *piece = [part stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; if (piece.length > 0) { [items addObject:piece]; } } return items.count > 0 ? items : @[trimmed]; } - (void)kb_updateButtonsLayout { if (self.showsCancelButton) { self.cancelButton.hidden = NO; [self.cancelButton mas_remakeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self).offset(KBFit(24.0)); make.bottom.equalTo(self).offset(-KBFit(12.0)); make.height.mas_equalTo(KBFit(45.0)); }]; [self.upgradeButton mas_remakeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.cancelButton.mas_right).offset(KBFit(12.0)); make.right.equalTo(self).offset(-KBFit(24.0)); make.bottom.equalTo(self.cancelButton); make.height.equalTo(self.cancelButton); make.width.equalTo(self.cancelButton); }]; } else { self.cancelButton.hidden = YES; [self.cancelButton mas_remakeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self); make.bottom.equalTo(self).offset(-KBFit(12.0)); make.width.mas_equalTo(0.0); make.height.mas_equalTo(0.0); }]; [self.upgradeButton mas_remakeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self); make.bottom.equalTo(self).offset(-KBFit(12.0)); make.width.mas_equalTo(KBFit(230.0)); make.height.mas_equalTo(KBFit(45.0)); }]; } [self layoutIfNeeded]; } #pragma mark - Lazy - (UIImageView *)backgroundImageView { if (!_backgroundImageView) { _backgroundImageView = [[UIImageView alloc] init]; _backgroundImageView.contentMode = UIViewContentModeScaleAspectFill; _backgroundImageView.clipsToBounds = YES; } return _backgroundImageView; } - (UILabel *)titleLabel { if (!_titleLabel) { _titleLabel = [[UILabel alloc] init]; _titleLabel.numberOfLines = 0; _titleLabel.font = [KBFont bold:26.0]; _titleLabel.textColor = [UIColor colorWithHex:0xF6FCFF]; } return _titleLabel; } - (UIView *)versionBadgeView { if (!_versionBadgeView) { _versionBadgeView = [[UIView alloc] init]; _versionBadgeView.backgroundColor = [UIColor colorWithHex:0xFFDE67]; _versionBadgeView.layer.cornerRadius = KBFit(11.5); _versionBadgeView.layer.masksToBounds = YES; } return _versionBadgeView; } - (UILabel *)versionLabel { if (!_versionLabel) { _versionLabel = [[UILabel alloc] init]; _versionLabel.font = [KBFont regular:14.0]; _versionLabel.textColor = [UIColor colorWithHex:0x3D3D3D]; _versionLabel.textAlignment = NSTextAlignmentCenter; } return _versionLabel; } - (UILabel *)contentTitleLabel { if (!_contentTitleLabel) { _contentTitleLabel = [[UILabel alloc] init]; _contentTitleLabel.font = [KBFont regular:18.0]; _contentTitleLabel.textColor = [UIColor colorWithHex:0x085E59]; } return _contentTitleLabel; } - (UILabel *)contentLabel { if (!_contentLabel) { _contentLabel = [[UILabel alloc] init]; _contentLabel.numberOfLines = 0; _contentLabel.font = [KBFont medium:13.0]; _contentLabel.textColor = [UIColor colorWithHex:0x085E59]; } return _contentLabel; } - (UIScrollView *)contentScrollView { if (!_contentScrollView) { _contentScrollView = [[UIScrollView alloc] init]; _contentScrollView.showsVerticalScrollIndicator = YES; _contentScrollView.showsHorizontalScrollIndicator = NO; } return _contentScrollView; } - (UIButton *)upgradeButton { if (!_upgradeButton) { _upgradeButton = [UIButton buttonWithType:UIButtonTypeCustom]; _upgradeButton.backgroundColor = [UIColor colorWithHex:0x002339]; _upgradeButton.layer.cornerRadius = KBFit(22.5); _upgradeButton.layer.masksToBounds = YES; _upgradeButton.titleLabel.font = [KBFont bold:14.0]; [_upgradeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [_upgradeButton addTarget:self action:@selector(onTapUpgrade) forControlEvents:UIControlEventTouchUpInside]; } return _upgradeButton; } - (UIButton *)cancelButton { if (!_cancelButton) { _cancelButton = [UIButton buttonWithType:UIButtonTypeCustom]; _cancelButton.backgroundColor = [UIColor whiteColor]; _cancelButton.layer.cornerRadius = KBFit(22.5); _cancelButton.layer.masksToBounds = YES; _cancelButton.layer.borderWidth = KB_ONE_PIXEL; _cancelButton.layer.borderColor = [UIColor colorWithHex:0x002339].CGColor; _cancelButton.titleLabel.font = [KBFont bold:14.0]; [_cancelButton setTitleColor:[UIColor colorWithHex:0x002339] forState:UIControlStateNormal]; [_cancelButton addTarget:self action:@selector(onTapCancel) forControlEvents:UIControlEventTouchUpInside]; } return _cancelButton; } @end