LFLDarkModeKit
Adapter iOS DarkMode
适配支持 iOS 9.0+ 项目
-
对于iOS 13+,跟随系统暗黑开关
- 也支持自定义 APP 内开关,设置即可【参考下文说明】
-
对于iOS 13以下,则默认Light模式
- 也可以指定自定义模式,设置即可【参考下文说明】
-
获取状态切换【模式切换检测】
LFLDarkModeKit 详细信息
- CGColor 静态变化解决方案
- 常规项目的暗黑场景处理
通过 Apple API 适配说明
示例
要运行示例项目,请克隆仓库,然后首先从示例目录运行 pod install
。
安装
LFLDarkModeKit 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中:
pod 'LFLDarkModeKit', '~> 3.2.0'
LFLDarkModeKit 详细信息
- 布局类
.
├── Core
│ ├── LFLDarkModeManger.h
│ ├── LFLDarkModeManger.m
│ ├── UIColor+LFLDarkMode.h
│ ├── UIColor+LFLDarkMode.m
│ ├── UIView+LFLDarkMode.h
│ └── UIView+LFLDarkMode.m
├── LFLDarkModeKit.h
└── Tool
├── NSString+DarkModeKitBlank.h
└── NSString+DarkModeKitBlank.m
└── UIWindow+DarkModeKitKeyWondow.h
└── UIWindow+DarkModeKitKeyWondow.m
项目创建源包
各项目自定义色值字符串映射对应颜色
-
示例:@“PColor0” 在dark和light模式下分别对应不同的真实色值,一一映射,后续可支持新增模式
-
示例:darkModeAdapterColor.bundle (颜色集合)
- dark.plist
- light.plist
配置暗模式颜色包URL
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSURL *darkModeBundleURL = [[NSBundle mainBundle] URLForResource:@"darkModeAdapterColor" withExtension:@"bundle"];
[[LFLDarkModeManger sharedInstance] configDarkModeColorBundleURL:darkModeBundleURL];
return YES;
}
用户自定义模式 【可不跟随系统开关】
// 配置开启用户自定义开关模式
[LFLDarkModeManger.sharedInstance configUserDarkMode:YES];
// 获取当前用户自定义是否暗黑模式
[LFLDarkModeManger.sharedInstance isUserDarkMode];
获取状态切换【模式切换检测】
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_darkModeNoti:) name:LFLDarkModeChangeNotification object:nil];
- (void)_darkModeNoti:(NSNotification *)noti {
NSDictionary *darkModeDic = noti.object;
NSLog(@"\n通知:暗黑模式切换检测%@",darkModeDic);
}
使用示例
// view
self.exampleLabel.textColor = [UIColor ColorAdpterWithHex:@"DEMO"];
// Imageview
self.adapterImageView.image = [UIImage imageAdapterNamed:@"exampleImage"];
// Layer
self.customView.layerBorderColorHex = @"DEMO";
Apple API 项目适配器描述
全局关闭暗黑模式:在Info.plist文件中,添加UIUserInterfaceStyle键,命名为用户界面样式,值为String,将UIUserInterfaceStyle键的值设置为Light
图片适配器
- 如果项目中需要适配暗黑模式的图片,可以在Assets.xcassets中设置,具体需要什么样式根据项目情况自行设置
- 任意暗黑
UIColor
- iOS13 API(当系统切换模式时,自动触发这两个方法以动态修改控件颜色)
+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
- (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *traitCollection))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
CGColor
设置的CGColor不会动态改变,可以通过以下方案处理
如果适配CGColor,通常需要各自自定义view实现此函数再处理,相对较麻烦。
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
// Config Color Adapter
}
}
- performAsCurrent
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
[self.traitCollection performAsCurrentTraitCollection:^{
layer.backgroundColor = xxColor.CGColor;
}];
}
VC配置单样式
if (@available(iOS 13.0, *)) {
[self setOverrideUserInterfaceStyle:UIUserInterfaceStyleDark];
} else {
}
xib / Story
- 颜色集
- 任意暗黑
- [UIColor colorNamed:@"customBlueColor"]
NSAttributedString
NSDictionary * attributeDic = @{NSFontAttributeName:[UIFont systemFontOfSize:16],NSForegroundColorAttributeName:[UIColor xxColor]};
UIActivityIndicatorView
typedef NS_ENUM(NSInteger, UIActivityIndicatorViewStyle) {
UIActivityIndicatorViewStyleMedium,
UIActivityIndicatorViewStyleLarge,
UIActivityIndicatorViewStyleWhiteLarge API_DEPRECATED_WITH_REPLACEMENT("UIActivityIndicatorViewStyleLarge",
UIActivityIndicatorViewStyleWhite API_DEPRECATED_WITH_REPLACEMENT("UIActivityIndicatorViewStyleMedium",
UIActivityIndicatorViewStyleGray API_DEPRECATED_WITH_REPLACEMENT("UIActivityIndicatorViewStyleMedium",
};
Life Style
-
UIView
- traitCollectionDidChange(_:)
- layoutSubviews()
- draw(_:)
- updateConstraints()
- tintColorDidChange()
-
UIViewController
- traitCollectionDidChange(_:)
- updateViewConstraints()
- viewWillLayoutSubviews()
- viewDidLayoutSubviews()
-
UIPresentationController
- traitCollectionDidChange(_:)
- containerViewWillLayoutSubviews()
- containerViewDidLayoutSubviews()
作者
许可
LFLDarkModeKit 遵循 MIT 许可证。有关更多信息,请参阅 LICENSE 文件。