Files
keyboard/CustomKeyboard/View/KBKeyButton.m
2025-11-18 20:53:47 +08:00

107 lines
3.6 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.

//
// 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