1
This commit is contained in:
@@ -73,6 +73,9 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@end
|
@end
|
||||||
|
|
||||||
@interface KBKeyboardLayout : NSObject
|
@interface KBKeyboardLayout : NSObject
|
||||||
|
@property (nonatomic, strong, nullable) NSNumber *rowSpacing;
|
||||||
|
@property (nonatomic, strong, nullable) NSNumber *topInset;
|
||||||
|
@property (nonatomic, strong, nullable) NSNumber *bottomInset;
|
||||||
@property (nonatomic, strong, nullable) NSArray<KBKeyboardRowConfig *> *rows;
|
@property (nonatomic, strong, nullable) NSArray<KBKeyboardRowConfig *> *rows;
|
||||||
@property (nonatomic, strong, nullable) NSArray<KBKeyboardRowConfig *> *shiftRows;
|
@property (nonatomic, strong, nullable) NSArray<KBKeyboardRowConfig *> *shiftRows;
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -184,6 +184,9 @@ static NSString * const kKBKeyboardLayoutI18nFileName = @"kb_keyboard_layouts_i1
|
|||||||
}
|
}
|
||||||
|
|
||||||
KBKeyboardLayout *mergedLayout = [KBKeyboardLayout new];
|
KBKeyboardLayout *mergedLayout = [KBKeyboardLayout new];
|
||||||
|
mergedLayout.rowSpacing = baseLayout.rowSpacing ?: layout.rowSpacing;
|
||||||
|
mergedLayout.topInset = baseLayout.topInset ?: layout.topInset;
|
||||||
|
mergedLayout.bottomInset = baseLayout.bottomInset ?: layout.bottomInset;
|
||||||
mergedLayout.rows = [self kb_mergeRowsFromBase:baseLayout.rows override:layout.rows];
|
mergedLayout.rows = [self kb_mergeRowsFromBase:baseLayout.rows override:layout.rows];
|
||||||
mergedLayout.shiftRows = [self kb_mergeRowsFromBase:baseLayout.shiftRows override:layout.shiftRows];
|
mergedLayout.shiftRows = [self kb_mergeRowsFromBase:baseLayout.shiftRows override:layout.shiftRows];
|
||||||
mergedLayouts[key] = mergedLayout;
|
mergedLayouts[key] = mergedLayout;
|
||||||
|
|||||||
@@ -835,6 +835,9 @@
|
|||||||
"letters_bopomofo_full": {
|
"letters_bopomofo_full": {
|
||||||
"__comment": "繁体注音全键盘布局(iOS 标准注音排列)",
|
"__comment": "繁体注音全键盘布局(iOS 标准注音排列)",
|
||||||
"__comment_layout": "第一行:ㄅㄉˇˋㄓˊ˙ㄚㄞㄢㄦ | 第二行:ㄆㄊㄍㄐㄔㄗㄧㄛㄟㄣ | 第三行:ㄇㄋㄎㄑㄕㄘㄨㄜㄠㄤ | 第四行:ㄈㄌㄏㄒㄖㄙㄩㄝㄡㄥ",
|
"__comment_layout": "第一行:ㄅㄉˇˋㄓˊ˙ㄚㄞㄢㄦ | 第二行:ㄆㄊㄍㄐㄔㄗㄧㄛㄟㄣ | 第三行:ㄇㄋㄎㄑㄕㄘㄨㄜㄠㄤ | 第四行:ㄈㄌㄏㄒㄖㄙㄩㄝㄡㄥ",
|
||||||
|
"rowSpacing": 3,
|
||||||
|
"topInset": 5,
|
||||||
|
"bottomInset": 0,
|
||||||
"rows": [
|
"rows": [
|
||||||
{
|
{
|
||||||
"align": "left",
|
"align": "left",
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
[self addSubview:self.suggestionBar];
|
[self addSubview:self.suggestionBar];
|
||||||
|
|
||||||
// 键盘区域(高度按照设计值做等比缩放,避免不同机型上按键被压缩/拉伸)
|
// 键盘区域(高度按照设计值做等比缩放,避免不同机型上按键被压缩/拉伸)
|
||||||
CGFloat keyboardAreaHeight = KBFit(200.0f);
|
CGFloat keyboardAreaHeight = KBFit(215.0f);
|
||||||
KBKeyboardLayoutConfig *layoutConfig = [KBKeyboardLayoutConfig sharedConfig];
|
KBKeyboardLayoutConfig *layoutConfig = [KBKeyboardLayoutConfig sharedConfig];
|
||||||
if (layoutConfig) {
|
if (layoutConfig) {
|
||||||
CGFloat configHeight = [layoutConfig keyboardAreaScaledHeight];
|
CGFloat configHeight = [layoutConfig keyboardAreaScaledHeight];
|
||||||
|
|||||||
@@ -35,6 +35,11 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5;
|
|||||||
@property (nonatomic, strong) KBKeyboardLayoutConfig *layoutConfig;
|
@property (nonatomic, strong) KBKeyboardLayoutConfig *layoutConfig;
|
||||||
/// 跨行统一字符键宽度(按最多字符键的行计算),0 表示不启用
|
/// 跨行统一字符键宽度(按最多字符键的行计算),0 表示不启用
|
||||||
@property (nonatomic, assign) CGFloat kb_uniformCharKeyWidth;
|
@property (nonatomic, assign) CGFloat kb_uniformCharKeyWidth;
|
||||||
|
/// 记录当前行间距,便于切换布局时判断是否需要重建容器
|
||||||
|
@property (nonatomic, assign) CGFloat kb_currentRowSpacing;
|
||||||
|
/// 记录当前顶/底间距,便于切换布局时判断是否需要重建容器
|
||||||
|
@property (nonatomic, assign) CGFloat kb_currentTopInset;
|
||||||
|
@property (nonatomic, assign) CGFloat kb_currentBottomInset;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation KBKeyboardView
|
@implementation KBKeyboardView
|
||||||
@@ -82,11 +87,23 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5;
|
|||||||
rows = @[[KBKeyboardRowConfig new], [KBKeyboardRowConfig new],
|
rows = @[[KBKeyboardRowConfig new], [KBKeyboardRowConfig new],
|
||||||
[KBKeyboardRowConfig new], [KBKeyboardRowConfig new]];
|
[KBKeyboardRowConfig new], [KBKeyboardRowConfig new]];
|
||||||
}
|
}
|
||||||
[self kb_rebuildRowContainersForRows:rows];
|
CGFloat rowSpacing = [self kb_rowSpacingForLayout:layout];
|
||||||
|
CGFloat topInset = [self kb_topInsetForLayout:layout];
|
||||||
|
CGFloat bottomInset = [self kb_bottomInsetForLayout:layout];
|
||||||
|
self.kb_currentRowSpacing = rowSpacing;
|
||||||
|
self.kb_currentTopInset = topInset;
|
||||||
|
self.kb_currentBottomInset = bottomInset;
|
||||||
|
[self kb_rebuildRowContainersForRows:rows
|
||||||
|
rowSpacing:rowSpacing
|
||||||
|
topInset:topInset
|
||||||
|
bottomInset:bottomInset];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 根据行配置数组,动态创建/重建行容器(支持 4 行、5 行等任意行数)
|
/// 根据行配置数组,动态创建/重建行容器(支持 4 行、5 行等任意行数)
|
||||||
- (void)kb_rebuildRowContainersForRows:(NSArray<KBKeyboardRowConfig *> *)rowConfigs {
|
- (void)kb_rebuildRowContainersForRows:(NSArray<KBKeyboardRowConfig *> *)rowConfigs
|
||||||
|
rowSpacing:(CGFloat)rowSpacing
|
||||||
|
topInset:(CGFloat)topInset
|
||||||
|
bottomInset:(CGFloat)bottomInset {
|
||||||
// 移除旧的行容器
|
// 移除旧的行容器
|
||||||
for (UIView *row in self.rowViews) {
|
for (UIView *row in self.rowViews) {
|
||||||
[row removeFromSuperview];
|
[row removeFromSuperview];
|
||||||
@@ -97,9 +114,6 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5;
|
|||||||
if (rowCount == 0) return;
|
if (rowCount == 0) return;
|
||||||
|
|
||||||
KBKeyboardLayoutConfig *config = [self kb_layoutConfig];
|
KBKeyboardLayoutConfig *config = [self kb_layoutConfig];
|
||||||
CGFloat rowSpacing = [self kb_metricValue:config.metrics.rowSpacing fallback:nil defaultValue:8.0];
|
|
||||||
CGFloat topInset = [self kb_metricValue:config.metrics.topInset fallback:nil defaultValue:8.0];
|
|
||||||
CGFloat bottomInset = [self kb_metricValue:config.metrics.bottomInset fallback:nil defaultValue:6.0];
|
|
||||||
|
|
||||||
UIView *firstRow = nil;
|
UIView *firstRow = nil;
|
||||||
UIView *previousRow = nil;
|
UIView *previousRow = nil;
|
||||||
@@ -121,11 +135,11 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5;
|
|||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
|
|
||||||
// 最后一行锚定到底部
|
// 最后一行锚定到底部
|
||||||
if (i == rowCount - 1) {
|
if (i == rowCount - 1) {
|
||||||
[rowView mas_makeConstraints:^(MASConstraintMaker *make) {
|
[rowView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||||
make.bottom.equalTo(self.mas_bottom).offset(-bottomInset);
|
make.bottom.equalTo(self.mas_bottom).offset(-bottomInset);
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!firstRow) firstRow = rowView;
|
if (!firstRow) firstRow = rowView;
|
||||||
@@ -144,6 +158,9 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5;
|
|||||||
[self.backspaceHandler bindDeleteButton:nil showClearLabel:NO];
|
[self.backspaceHandler bindDeleteButton:nil showClearLabel:NO];
|
||||||
|
|
||||||
KBKeyboardLayout *layout = [self kb_currentLayout];
|
KBKeyboardLayout *layout = [self kb_currentLayout];
|
||||||
|
CGFloat rowSpacing = [self kb_rowSpacingForLayout:layout];
|
||||||
|
CGFloat topInset = [self kb_topInsetForLayout:layout];
|
||||||
|
CGFloat bottomInset = [self kb_bottomInsetForLayout:layout];
|
||||||
NSLog(@"[KBKeyboardView] reloadKeys: layoutName=%@ rows=%lu shiftRows=%lu shiftOn=%d",
|
NSLog(@"[KBKeyboardView] reloadKeys: layoutName=%@ rows=%lu shiftRows=%lu shiftOn=%d",
|
||||||
self.currentLayoutJsonId, (unsigned long)layout.rows.count, (unsigned long)layout.shiftRows.count, self.shiftOn);
|
self.currentLayoutJsonId, (unsigned long)layout.rows.count, (unsigned long)layout.shiftRows.count, self.shiftOn);
|
||||||
|
|
||||||
@@ -159,8 +176,18 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5;
|
|||||||
(unsigned long)rows.count, (unsigned long)self.rowViews.count);
|
(unsigned long)rows.count, (unsigned long)self.rowViews.count);
|
||||||
|
|
||||||
// 行数变化时(如从 4 行布局切到 5 行注音布局),重建行容器
|
// 行数变化时(如从 4 行布局切到 5 行注音布局),重建行容器
|
||||||
if (rows.count >= 4 && rows.count != self.rowViews.count) {
|
if (rows.count >= 4 &&
|
||||||
[self kb_rebuildRowContainersForRows:rows];
|
(rows.count != self.rowViews.count ||
|
||||||
|
fabs(self.kb_currentRowSpacing - rowSpacing) > 0.1 ||
|
||||||
|
fabs(self.kb_currentTopInset - topInset) > 0.1 ||
|
||||||
|
fabs(self.kb_currentBottomInset - bottomInset) > 0.1)) {
|
||||||
|
self.kb_currentRowSpacing = rowSpacing;
|
||||||
|
self.kb_currentTopInset = topInset;
|
||||||
|
self.kb_currentBottomInset = bottomInset;
|
||||||
|
[self kb_rebuildRowContainersForRows:rows
|
||||||
|
rowSpacing:rowSpacing
|
||||||
|
topInset:topInset
|
||||||
|
bottomInset:bottomInset];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 移除旧按钮
|
// 移除旧按钮
|
||||||
@@ -1003,6 +1030,24 @@ edgeSpacerMultiplier:(CGFloat)edgeSpacerMultiplier {
|
|||||||
return self.layoutConfig;
|
return self.layoutConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (CGFloat)kb_rowSpacingForLayout:(KBKeyboardLayout *)layout {
|
||||||
|
KBKeyboardLayoutConfig *config = [self kb_layoutConfig];
|
||||||
|
NSNumber *layoutSpacing = layout.rowSpacing;
|
||||||
|
return [self kb_metricValue:layoutSpacing fallback:config.metrics.rowSpacing defaultValue:8.0];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (CGFloat)kb_topInsetForLayout:(KBKeyboardLayout *)layout {
|
||||||
|
KBKeyboardLayoutConfig *config = [self kb_layoutConfig];
|
||||||
|
NSNumber *layoutInset = layout.topInset;
|
||||||
|
return [self kb_metricValue:layoutInset fallback:config.metrics.topInset defaultValue:8.0];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (CGFloat)kb_bottomInsetForLayout:(KBKeyboardLayout *)layout {
|
||||||
|
KBKeyboardLayoutConfig *config = [self kb_layoutConfig];
|
||||||
|
NSNumber *layoutInset = layout.bottomInset;
|
||||||
|
return [self kb_metricValue:layoutInset fallback:config.metrics.bottomInset defaultValue:6.0];
|
||||||
|
}
|
||||||
|
|
||||||
- (KBKeyboardLayout *)kb_layoutForName:(NSString *)name {
|
- (KBKeyboardLayout *)kb_layoutForName:(NSString *)name {
|
||||||
return [[self kb_layoutConfig] layoutForName:name];
|
return [[self kb_layoutConfig] layoutForName:name];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user