// // 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 = UIViewContentModeScaleAspectFill; 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; // 每次切换按键模型时,根据皮肤刷新一次图标和文字显隐 [self applyThemeForCurrentKey]; } - (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 { // 依据皮肤决定是否显示文字 NSString *identifier = self.key.identifier; BOOL hideText = [[KBSkinManager shared] shouldHideKeyTextForIdentifier:identifier]; self.titleLabel.hidden = hideText; // 根据皮肤映射加载图标(若有),支持大小写变体: // - identifier: 逻辑按键标识(如 letter_q) // - caseVariant: 0/1/2 => 无变体/小写/大写 NSInteger variant = (NSInteger)self.key.caseVariant; UIImage *iconImg = [[KBSkinManager shared] iconImageForKeyIdentifier:identifier caseVariant:variant]; self.iconView.image = iconImg; self.iconView.hidden = (iconImg == nil); } @end