1
This commit is contained in:
@@ -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<KBKeyboardRowConfig *> *)rowConfigs {
|
||||
- (void)kb_rebuildRowContainersForRows:(NSArray<KBKeyboardRowConfig *> *)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];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user