暗黑模式适配

参考文章地址: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、图片适配

图片适配参考上面链接
注意设置tabbar图片的 RenderingMode为original(tabbar图片render as配置为origin)

二、获取当前模式

参考上面链接

三、检测模式变化

可以在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

你可能感兴趣的:(暗黑模式适配)