参考文章地址:https://www.jianshu.com/p/0da3b107f06c
一、适配暗黑模式
1、颜色适配
iOS13以后,颜色都可以设置成动态颜色,系统也有很多动态颜色,不过我们项目中一般都是UI给出的16进制颜色,我们一般是通过UIColor分类(或者新建一个获取颜色的类)来获取动态颜色,代码类似这样:
//MARK: -根据情况返回不同的颜色 每个动态颜色都调用这个方法获取
+ (UIColor *)generateDynamicColor:(UIColor *)lightColor darkColor:(UIColor *)darkColor {
if (@available(iOS 13.0, *)) {
UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleLight) {
return lightColor;
}else {
return darkColor;
}
}];
return dyColor;
} else {
return lightColor;
}
}
注意点:此时颜色基本已经解决,但是如果是CGColor则不同,Color我们设置过后,系统切换到暗黑模式后,会自动变为darkColor,但是CGColor仍然是单一颜色,我们需要在检测到系统模式变化时重新设置一遍(检测模式变化下面讲)
2、图片适配
图片适配参考上面链接
二、获取当前模式
参考上面链接
三、检测模式变化
可以在UIView、UIViewController以及其子类里面实现协议方法监测模式变化
//MARK: -检测模式变化
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
///增加处理代码
}
四、项目内设置模式开关(仿微信暗黑模式设置页面)
注意增加版本判断
1、不随系统变化,整个项目暗黑
self.view.window.overrideUserInterfaceStyle = UIUserInterfaceStyleDark;
2、不随系统变化,整个项目亮色
self.view.window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
3、跟随系统变化
self.view.window.overrideUserInterfaceStyle = UIUserInterfaceStyleUnspecified;
注意:如果自己手动设置,不随着系统变化,需要在设置时保存这个状态到本地,在启动时, 根据缓存的状态重新设置window的overrideUserInterfaceStyle
网友评论