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) {