diff --git a/CustomKeyboard/Model/KBKeyboardLayoutConfig.h b/CustomKeyboard/Model/KBKeyboardLayoutConfig.h index 1f94480..acedb1d 100644 --- a/CustomKeyboard/Model/KBKeyboardLayoutConfig.h +++ b/CustomKeyboard/Model/KBKeyboardLayoutConfig.h @@ -73,6 +73,9 @@ NS_ASSUME_NONNULL_BEGIN @end @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 *rows; @property (nonatomic, strong, nullable) NSArray *shiftRows; @end diff --git a/CustomKeyboard/Model/KBKeyboardLayoutConfig.m b/CustomKeyboard/Model/KBKeyboardLayoutConfig.m index 94a0c97..d16eaaf 100644 --- a/CustomKeyboard/Model/KBKeyboardLayoutConfig.m +++ b/CustomKeyboard/Model/KBKeyboardLayoutConfig.m @@ -184,6 +184,9 @@ static NSString * const kKBKeyboardLayoutI18nFileName = @"kb_keyboard_layouts_i1 } 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.shiftRows = [self kb_mergeRowsFromBase:baseLayout.shiftRows override:layout.shiftRows]; mergedLayouts[key] = mergedLayout; diff --git a/CustomKeyboard/Resource/kb_keyboard_layout_config.json b/CustomKeyboard/Resource/kb_keyboard_layout_config.json index 3a752df..34a5be2 100644 --- a/CustomKeyboard/Resource/kb_keyboard_layout_config.json +++ b/CustomKeyboard/Resource/kb_keyboard_layout_config.json @@ -835,6 +835,9 @@ "letters_bopomofo_full": { "__comment": "繁体注音全键盘布局(iOS 标准注音排列)", "__comment_layout": "第一行:ㄅㄉˇˋㄓˊ˙ㄚㄞㄢㄦ | 第二行:ㄆㄊㄍㄐㄔㄗㄧㄛㄟㄣ | 第三行:ㄇㄋㄎㄑㄕㄘㄨㄜㄠㄤ | 第四行:ㄈㄌㄏㄒㄖㄙㄩㄝㄡㄥ", + "rowSpacing": 3, + "topInset": 5, + "bottomInset": 0, "rows": [ { "align": "left", diff --git a/CustomKeyboard/View/KBKeyBoardMainView.m b/CustomKeyboard/View/KBKeyBoardMainView.m index 80ac23d..2ec4156 100644 --- a/CustomKeyboard/View/KBKeyBoardMainView.m +++ b/CustomKeyboard/View/KBKeyBoardMainView.m @@ -45,7 +45,7 @@ [self addSubview:self.suggestionBar]; // 键盘区域(高度按照设计值做等比缩放,避免不同机型上按键被压缩/拉伸) - CGFloat keyboardAreaHeight = KBFit(200.0f); + CGFloat keyboardAreaHeight = KBFit(215.0f); KBKeyboardLayoutConfig *layoutConfig = [KBKeyboardLayoutConfig sharedConfig]; if (layoutConfig) { CGFloat configHeight = [layoutConfig keyboardAreaScaledHeight]; diff --git a/CustomKeyboard/View/KBKeyboardView.m b/CustomKeyboard/View/KBKeyboardView.m index e6ae639..1e538d5 100644 --- a/CustomKeyboard/View/KBKeyboardView.m +++ b/CustomKeyboard/View/KBKeyboardView.m @@ -35,6 +35,11 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5; @property (nonatomic, strong) KBKeyboardLayoutConfig *layoutConfig; /// 跨行统一字符键宽度(按最多字符键的行计算),0 表示不启用 @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 @implementation KBKeyboardView @@ -82,11 +87,23 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5; rows = @[[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 行等任意行数) -- (void)kb_rebuildRowContainersForRows:(NSArray *)rowConfigs { +- (void)kb_rebuildRowContainersForRows:(NSArray *)rowConfigs + rowSpacing:(CGFloat)rowSpacing + topInset:(CGFloat)topInset + bottomInset:(CGFloat)bottomInset { // 移除旧的行容器 for (UIView *row in self.rowViews) { [row removeFromSuperview]; @@ -97,9 +114,6 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5; if (rowCount == 0) return; 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 *previousRow = nil; @@ -121,11 +135,11 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5; } }]; - // 最后一行锚定到底部 - if (i == rowCount - 1) { - [rowView mas_makeConstraints:^(MASConstraintMaker *make) { - make.bottom.equalTo(self.mas_bottom).offset(-bottomInset); - }]; + // 最后一行锚定到底部 + if (i == rowCount - 1) { + [rowView mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.equalTo(self.mas_bottom).offset(-bottomInset); + }]; } if (!firstRow) firstRow = rowView; @@ -144,6 +158,9 @@ static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5; [self.backspaceHandler bindDeleteButton:nil showClearLabel:NO]; 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", 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); // 行数变化时(如从 4 行布局切到 5 行注音布局),重建行容器 - if (rows.count >= 4 && rows.count != self.rowViews.count) { - [self kb_rebuildRowContainersForRows:rows]; + if (rows.count >= 4 && + (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; } +- (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 { return [[self kb_layoutConfig] layoutForName:name]; }