From ef332ecaa1bc33f972c1da73f15038dcc1256269 Mon Sep 17 00:00:00 2001 From: CodeST <694468528@qq.com> Date: Fri, 9 Jan 2026 13:07:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=BB=98=E8=AE=A4=E7=9A=AE=E8=82=A4=E9=80=82?= =?UTF-8?q?=E9=85=8D=E6=9A=97=E9=BB=91=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CustomKeyboard/KeyboardViewController.m | 54 ++++++++++++++++++++----- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/CustomKeyboard/KeyboardViewController.m b/CustomKeyboard/KeyboardViewController.m index 3d880ef..e55c7c2 100644 --- a/CustomKeyboard/KeyboardViewController.m +++ b/CustomKeyboard/KeyboardViewController.m @@ -31,8 +31,10 @@ // 以 375 宽设计稿为基准的键盘总高度 static const CGFloat kKBKeyboardBaseHeight = 250.0f; -static NSString * const kKBDefaultSkinId = @"normal_them"; -static NSString * const kKBDefaultSkinZipName = @"normal_them"; +static NSString * const kKBDefaultSkinIdLight = @"normal_them"; +static NSString * const kKBDefaultSkinZipNameLight = @"normal_them"; +static NSString * const kKBDefaultSkinIdDark = @"normal_hei_them"; +static NSString * const kKBDefaultSkinZipNameDark = @"normal_hei_them"; static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, void *observer, @@ -120,6 +122,15 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, [[KBBackspaceUndoManager shared] registerNonClearAction]; } +- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection { + [super traitCollectionDidChange:previousTraitCollection]; + if (@available(iOS 13.0, *)) { + if (previousTraitCollection.userInterfaceStyle != self.traitCollection.userInterfaceStyle) { + [self kb_applyDefaultSkinIfNeeded]; + } + } +} + - (void)textDidChange:(id)textInput { [super textDidChange:textInput]; [[KBInputBufferManager shared] updateFromExternalContextBefore:self.textDocumentProxy.documentContextBeforeInput @@ -771,7 +782,25 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, if (skinId.length == 0 || [skinId isEqualToString:@"default"]) { return YES; } - return [skinId isEqualToString:kKBDefaultSkinId]; + if ([skinId isEqualToString:kKBDefaultSkinIdLight]) { + return YES; + } + return [skinId isEqualToString:kKBDefaultSkinIdDark]; +} + +- (BOOL)kb_isDarkModeActive { + if (@available(iOS 13.0, *)) { + return self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark; + } + return NO; +} + +- (NSString *)kb_defaultSkinIdForCurrentStyle { + return [self kb_isDarkModeActive] ? kKBDefaultSkinIdDark : kKBDefaultSkinIdLight; +} + +- (NSString *)kb_defaultSkinZipNameForCurrentStyle { + return [self kb_isDarkModeActive] ? kKBDefaultSkinZipNameDark : kKBDefaultSkinZipNameLight; } - (UIImage *)kb_defaultGradientImageWithSize:(CGSize)size { @@ -858,21 +887,24 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, NSString *currentId = [KBSkinManager shared].current.skinId ?: @""; BOOL isDefault = (currentId.length == 0 || [currentId isEqualToString:@"default"]); - if (!isDefault && ![currentId isEqualToString:kKBDefaultSkinId]) { - return; - } - if ([currentId isEqualToString:kKBDefaultSkinId]) { + BOOL isLightDefault = [currentId isEqualToString:kKBDefaultSkinIdLight]; + BOOL isDarkDefault = [currentId isEqualToString:kKBDefaultSkinIdDark]; + if (!isDefault && !isLightDefault && !isDarkDefault) { + // 用户已应用自定义皮肤:不随深色模式切换默认皮肤 return; } + NSString *targetId = [self kb_defaultSkinIdForCurrentStyle]; + NSString *targetZip = [self kb_defaultSkinZipNameForCurrentStyle]; + if (currentId.length > 0 && [currentId isEqualToString:targetId]) { return; } NSError *applyError = nil; - if ([KBSkinInstallBridge applyInstalledSkinWithId:kKBDefaultSkinId error:&applyError]) { + if ([KBSkinInstallBridge applyInstalledSkinWithId:targetId error:&applyError]) { return; } - [KBSkinInstallBridge publishBundleSkinRequestWithId:kKBDefaultSkinId - name:kKBDefaultSkinId - zipName:kKBDefaultSkinZipName + [KBSkinInstallBridge publishBundleSkinRequestWithId:targetId + name:targetId + zipName:targetZip iconShortNames:nil]; [KBSkinInstallBridge consumePendingRequestFromBundle:NSBundle.mainBundle completion:^(__unused BOOL success, __unused NSError * _Nullable error) {