118 lines
4.1 KiB
Objective-C
118 lines
4.1 KiB
Objective-C
//
|
||
// 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;
|
||
}
|
||
|
||
- (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
|