From 8296ac12b66def7fb0ab192f57035d498f891276 Mon Sep 17 00:00:00 2001 From: CodeST <694468528@qq.com> Date: Thu, 20 Nov 2025 20:17:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=AE=E7=9B=98UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomKeyboard/Resource/KBSkinIconMap.strings | 1 + CustomKeyboard/Resource/fense.zip | Bin 775076 -> 784557 bytes CustomKeyboard/View/KBKeyboardView.m | 57 +++++++++++++----- keyBoard.xcodeproj/project.pbxproj | 8 +-- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/CustomKeyboard/Resource/KBSkinIconMap.strings b/CustomKeyboard/Resource/KBSkinIconMap.strings index 777b71e..2ae0dba 100644 --- a/CustomKeyboard/Resource/KBSkinIconMap.strings +++ b/CustomKeyboard/Resource/KBSkinIconMap.strings @@ -227,6 +227,7 @@ "backspace" = "key_del"; /* Shift(⇧) */ "shift" = "key_up"; +/* Shift(⇧)大写 */ "shift_upper" = "key_up_upper"; /* 字母面板左下角 "123" */ "mode_123" = "key_123"; diff --git a/CustomKeyboard/Resource/fense.zip b/CustomKeyboard/Resource/fense.zip index f35019bb449e35fb63171c8776c6aac31f486d8c..d6800c011a1f78f709d70ae1736218f5e31b6182 100644 GIT binary patch delta 13588 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 u|6jpb@4=~$isp!-Tw#LXx7mH delta 4183 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 diff --git a/CustomKeyboard/View/KBKeyboardView.m b/CustomKeyboard/View/KBKeyboardView.m index a28662a..2cb036b 100644 --- a/CustomKeyboard/View/KBKeyboardView.m +++ b/CustomKeyboard/View/KBKeyboardView.m @@ -226,6 +226,10 @@ title:@"⇧" output:@"" type:KBKeyTypeShift]; + // Shift 键也支持大小写两套皮肤图: + // - shift.caseVariant = Lower 时,使用 KBSkinIconMap 中 "shift" 对应的短名; + // - shift.caseVariant = Upper 时,使用 "shift_upper" 对应的短名。 + shift.caseVariant = self.shiftOn ? KBKeyCaseVariantUpper : KBKeyCaseVariantLower; [row3 addObject:shift]; for (NSString *s in r3chars) { NSString *shown = self.shiftOn ? s : s.lowercaseString; @@ -357,14 +361,35 @@ // 第二遍:以首个字符键为基准,统一设置特殊键宽度倍数 KBKeyButton *firstChar = nil; + BOOL hasCharacterInRow = NO; for (KBKeyButton *b in row.subviews) { - if ([b isKindOfClass:[KBKeyButton class]] && b.key.type == KBKeyTypeCharacter) { firstChar = b; break; } + if (![b isKindOfClass:[KBKeyButton class]]) continue; + if (b.key.type == KBKeyTypeCharacter) { + firstChar = b; + hasCharacterInRow = YES; + break; + } } // 若该行没有字符键(例如底部控制行),则使用行内第一个按钮作为基准宽度 if (!firstChar) { - for (KBKeyButton *b in row.subviews) { if ([b isKindOfClass:[KBKeyButton class]]) { firstChar = b; break; } } + for (KBKeyButton *b in row.subviews) { + if ([b isKindOfClass:[KBKeyButton class]]) { + firstChar = b; + break; + } + } } if (firstChar) { + // 如果该行本身没有字符键(如底部控制行),且基准按钮是 123/ABC/AI/#+= 等, + // 也将其约束为 1:1,避免 123/ABC 不是正方形。 + if (!hasCharacterInRow && + (firstChar.key.type == KBKeyTypeModeChange || + firstChar.key.type == KBKeyTypeSymbolsToggle || + firstChar.key.type == KBKeyTypeCustom)) { + [firstChar mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.equalTo(firstChar.mas_height); + }]; + } for (KBKeyButton *b in row.subviews) { if (![b isKindOfClass:[KBKeyButton class]]) continue; // 当本行没有字符键时,firstChar 可能是一个“特殊键”, @@ -372,30 +397,30 @@ if (b == firstChar) continue; if (b.key.type == KBKeyTypeCharacter) continue; - // 对 Shift 和 Backspace 强制做 1:1 按钮(宽度 = 高度), - // 主要作用于字母布局第三行左右两侧的两个键,避免被挤压导致图标变形。 - if (b.key.type == KBKeyTypeShift || b.key.type == KBKeyTypeBackspace) { + // 一类键强制宽高比 1:1: + // - 第三行:Shift、Backspace + // - 第四行:123/ABC(ModeChange)、#+=(SymbolsToggle)、AI(Custom) + BOOL isBottomModeKey = (b.key.type == KBKeyTypeModeChange) || + (b.key.type == KBKeyTypeSymbolsToggle) || + (b.key.type == KBKeyTypeCustom); + if (b.key.type == KBKeyTypeShift || + b.key.type == KBKeyTypeBackspace || + isBottomModeKey) { [b mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.equalTo(b.mas_height); + make.width.equalTo(b.mas_height); // 宽度 = 高度,做成正方形 }]; continue; } CGFloat multiplier = 1.5; - // Space 保持原来的长条比例 + // Space:根据行宽可压缩,适当缩小宽度(原来是 4.0,略微调低到 3.0) if (b.key.type == KBKeyTypeSpace) { - multiplier = 4.0; + multiplier = 3.0; } - // Send 按钮:宽度为基准键的 2.6 倍 + // Send 按钮:宽度为基准键的 2.4 倍 else if (b.key.type == KBKeyTypeReturn) { - multiplier = 2.6; - } - // 删除、123/ABC、#+=、AI:宽度与基准键一致(1 倍,“接近正方形”) - else if (b.key.type == KBKeyTypeModeChange || - b.key.type == KBKeyTypeSymbolsToggle || - b.key.type == KBKeyTypeCustom) { - multiplier = 1.0; + multiplier = 2.4; } // 其它特殊键(如 Globe)保持适度放大 else if (b.key.type == KBKeyTypeGlobe) { diff --git a/keyBoard.xcodeproj/project.pbxproj b/keyBoard.xcodeproj/project.pbxproj index 2a12a66..7014ab7 100644 --- a/keyBoard.xcodeproj/project.pbxproj +++ b/keyBoard.xcodeproj/project.pbxproj @@ -36,7 +36,7 @@ 0459D1B42EBA284C00F2D189 /* KBSkinCenterVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0459D1B32EBA284C00F2D189 /* KBSkinCenterVC.m */; }; 0459D1B72EBA287900F2D189 /* KBSkinManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0459D1B62EBA287900F2D189 /* KBSkinManager.m */; }; 0459D1B82EBA287900F2D189 /* KBSkinManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 0459D1B62EBA287900F2D189 /* KBSkinManager.m */; }; - 0461310F2ECF0FBC00A6FADF /* fense.zip in Resources */ = {isa = PBXBuildFile; fileRef = 0461310E2ECF0FBC00A6FADF /* fense.zip */; }; + 046131112ECF3A6E00A6FADF /* fense.zip in Resources */ = {isa = PBXBuildFile; fileRef = 046131102ECF3A6E00A6FADF /* fense.zip */; }; 0477BD952EBAFF4E0055D639 /* KBURLOpenBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 0477BD932EBAFF4E0055D639 /* KBURLOpenBridge.m */; }; 0477BDF02EBB76E30055D639 /* HomeSheetVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 0477BDEF2EBB76E30055D639 /* HomeSheetVC.m */; }; 0477BDF32EBB7B850055D639 /* KBDirectionIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0477BDF22EBB7B850055D639 /* KBDirectionIndicatorView.m */; }; @@ -229,7 +229,7 @@ 0459D1B32EBA284C00F2D189 /* KBSkinCenterVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBSkinCenterVC.m; sourceTree = ""; }; 0459D1B52EBA287900F2D189 /* KBSkinManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBSkinManager.h; sourceTree = ""; }; 0459D1B62EBA287900F2D189 /* KBSkinManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBSkinManager.m; sourceTree = ""; }; - 0461310E2ECF0FBC00A6FADF /* fense.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = fense.zip; sourceTree = ""; }; + 046131102ECF3A6E00A6FADF /* fense.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = fense.zip; sourceTree = ""; }; 0477BD922EBAFF4E0055D639 /* KBURLOpenBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBURLOpenBridge.h; sourceTree = ""; }; 0477BD932EBAFF4E0055D639 /* KBURLOpenBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBURLOpenBridge.m; sourceTree = ""; }; 0477BDEE2EBB76E30055D639 /* HomeSheetVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeSheetVC.h; sourceTree = ""; }; @@ -484,7 +484,7 @@ children = ( 041007D12ECE012000D203BB /* KBSkinIconMap.strings */, 041007D32ECE012500D203BB /* 002.zip */, - 0461310E2ECF0FBC00A6FADF /* fense.zip */, + 046131102ECF3A6E00A6FADF /* fense.zip */, ); path = Resource; sourceTree = ""; @@ -1425,7 +1425,7 @@ buildActionMask = 2147483647; files = ( 04A9FE202EB893F10020DB6D /* Localizable.strings in Resources */, - 0461310F2ECF0FBC00A6FADF /* fense.zip in Resources */, + 046131112ECF3A6E00A6FADF /* fense.zip in Resources */, 041007D42ECE012500D203BB /* 002.zip in Resources */, 041007D22ECE012000D203BB /* KBSkinIconMap.strings in Resources */, 04286A0B2ECD88B400CE730C /* KeyboardAssets.xcassets in Resources */,