// // KBKeyButton.m // CustomKeyboard // #import "KBKeyButton.h" #import "KBKey.h" #import "KBSkinManager.h" @interface KBKeyButton () @property (nonatomic, strong) UIImageView *iconView; @end @implementation KBKeyButton - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self applyDefaultStyle]; } return self; } - (void)applyDefaultStyle { self.titleLabel.font = [UIFont systemFontOfSize:18 weight:UIFontWeightSemibold]; KBSkinTheme *t = [KBSkinManager shared].current; [self setTitleColor:t.keyTextColor forState:UIControlStateNormal]; [self setTitleColor:t.keyTextColor forState:UIControlStateHighlighted]; self.backgroundColor = t.keyBackground; self.layer.cornerRadius = 6.0; // 圆角 self.layer.masksToBounds = NO; self.layer.shadowColor = [UIColor colorWithWhite:0 alpha:0.1].CGColor; // 阴影效果 self.layer.shadowOpacity = 1.0; self.layer.shadowOffset = CGSizeMake(0, 1); self.layer.shadowRadius = 1.5; [self refreshStateAppearance]; // 懒创建图标视图,用于后续皮肤按键小图标展示 if (!self.iconView) { UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectZero]; // 作为按键的整块皮肤背景,铺满整个按钮区域 iv.contentMode = UIViewContentModeScaleAspectFit; iv.clipsToBounds = YES; iv.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:iv]; // 让皮肤图片撑满整个按钮 [NSLayoutConstraint activateConstraints:@[ [iv.topAnchor constraintEqualToAnchor:self.topAnchor], [iv.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], [iv.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], [iv.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], ]]; self.iconView = iv; // 文字保持居中;若需要显示文字,则覆盖在皮肤图片之上 self.titleEdgeInsets = UIEdgeInsetsZero; [self bringSubviewToFront:self.titleLabel]; } } - (void)setKey:(KBKey *)key { _key = key; } - (void)setHighlighted:(BOOL)highlighted { [super setHighlighted:highlighted]; // 简单按压反馈:选中态不改变透明度,避免和高亮态冲突 if (self.isSelected) { self.alpha = 1.0; } else { self.alpha = highlighted ? 0.2 : 1.0; } } - (void)setSelected:(BOOL)selected { [super setSelected:selected]; [self refreshStateAppearance]; } - (void)refreshStateAppearance { // 选中态用于 Shift/CapsLock 等特殊按键的高亮显示 KBSkinTheme *t = [KBSkinManager shared].current; if (self.isSelected) { self.backgroundColor = t.keyHighlightBackground ?: t.keyBackground; } else { self.backgroundColor = t.keyBackground; } } - (void)applyThemeForCurrentKey { // 根据皮肤映射加载图标(若有),支持大小写变体: // - identifier: 逻辑按键标识(如 letter_q) // - caseVariant: 0/1/2 => 无变体/小写/大写 NSString *identifier = self.key.identifier; NSInteger variant = (NSInteger)self.key.caseVariant; UIImage *iconImg = [[KBSkinManager shared] iconImageForKeyIdentifier:identifier caseVariant:variant]; // 设置整块按键背景图(若有) self.iconView.image = iconImg; self.iconView.hidden = (iconImg == nil); BOOL hasIcon = (iconImg != nil); if (hasIcon) { // 有图标:仅显示图片,完全隐藏文字 [self setTitle:@"" forState:UIControlStateNormal]; [self setTitle:@"" forState:UIControlStateHighlighted]; [self setTitle:@"" forState:UIControlStateSelected]; self.titleLabel.hidden = YES; } else { // 无图标:按键标题正常显示(使用 key.title),并根据 hidden_keys 决定要不要隐藏 [self setTitle:self.key.title forState:UIControlStateNormal]; BOOL hideTextBySkin = [[KBSkinManager shared] shouldHideKeyTextForIdentifier:identifier]; self.titleLabel.hidden = hideTextBySkin; } } @end