• iOS 13.0 暗黑模式的适配


    一、暗黑模式的原理

    • 将原本的资源文件,创建出两种不同的模式。根据不同的模式,自动获取该样式的资源。
    • 每次切换系统模式的时候,系统会重新调用一些方法,重新赋值。

    二、暗黑模式适配主要考虑的是:

    • 1、 图片适配

    • 2、颜色适配(文字颜色,背景颜色)

    • 3、状态栏适配

    • 4、关闭暗⿊模式(或者关闭某⼀个页⾯的暗⿊模式)

    • 5、模式切换代理

    三、如果不需要适配暗黑模式的话去info里面关闭即可。

    在这里插入图片描述

    四、iOS13之前 UIColor 只能代表⼀种颜⾊,但是在iOS13之后,系统提供了⼀些 UIColor 的颜⾊是动态的,可以在 Light Mode 和 Dark Mode 下显⽰不同的颜色。在这⾥不多讲,因为真是开发中,⽂字颜⾊或者背景颜⾊都是UI设计好的,不太可能会⽤到系统的。

    系统提供的动态颜色有: labelColor、systemBackgroundColor、secondarySystemBackgroundColor、tertiarySystemBackgroundColor、systemGroupedBackgroundColor、secondarySystemGroupedBackgroundColor、tertiarySystemGroupedBackgroundColor等。

    五、颜色适配

    1、iOS13苹果提供了两个专⽤的⽅法:

    + (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);
    
    • 1
    • 2
    • 一个是类方法,一个是对象方法。
    • 这两个方法需要传入一个 block,当系统切换模式的时候,会触发回调。
    • 这个 block 会返回一个 UITraitCollection 类型的对象,通过其属性 userInterfaceStyle,可以得到当前是 LightMode 还是 DarkMode。就可以在不同的模式下设置想要的颜色。
    • 具体用法:创建一个 UIColor 的分类,调用 colorWithDynamicProvider:方法,判断 UITraitCollection 对象的 userInterfaceStyle 属性,根据响应的模式配置颜色。
    #import "UIColor+DarkAndLightColor.h"
    @implementation UIColor (DarkAndLightColor)
    + (UIColor *)colorWithLight:(UIColor *)lightColor dark:(UIColor *)darkColor {
        if (@available( iOS 13.0, *)) {
            return [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitCollection) {
                if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
                    return darkColor;
                } else {
                    return lightColor;
                }
            }];
        } else {
            return lightColor;
        }
    }
    @end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2、可以在 Assets.xcassets 文件中使用使用 ColorSet 直接动态设置不同模式下的颜色。

    • 打开Assets.xcassets
    • 新建一个Color set 选择右边栏的Appearances中对应的选项适配深色模式。

    在这里插入图片描述

    • 使用方法: self.view.backgroundColor = [UIColor colorNamed:@“testColor”];
    • 当模式发生变化时,UIColor会动态的获取对应模式下的颜色。

    六 图片适配 (使用ImageSet)

    • 打开Assets.xcassets
    • 新建一个Image set 选择右边栏的Appearances中对应的选项适配深色模式。

    在这里插入图片描述

    • 使用方法:[UIImage imageNamed:@“sousuo”];
    • 当模式变化时,UIImage会动态的获取对应模式下的图片资源。

    七、单个界面不遵循暗黑模式

    • UIViewController与UIView 都新增一个属性 overrideUserInterfaceStyle。
    • 将 overrideUserInterfaceStyle 设置为对应的模式,则强制限制该元素与其子元素以设置的模式进行展示,不跟随系统模式改变进行改变。
    • 设置 ViewController 的该属性, 将会影响视图控制器的视图和子视图控制器采用该样式。
    • 设置 View 的该属性, 将会影响视图及其所有子视图采用该样式。
    • 设置 Window 的该属性, 将会影响窗口中的所有内容都采用样式,包括根视图控制器和在该窗口中显示内容的所有演示控制器(UIPresentationController)。
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.title = @"SecondViewController";
        
        self.view.backgroundColor = [UIColor systemBackgroundColor];
        //设置当前控制器不遵循暗黑模式
        if (@available( iOS 13.0, *)) {
            self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
        } else {
            NSLog(@"版本低于 iOS 13.0 ");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    //需要监听系统暗黑模式切换的,看如下代理
    - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
        if (@available(iOS 13.0, *)) {
            if (UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
                NSLog(@"当前界面处于暗黑模式");
            } else {
                NSLog(@"当前模式处于Light模式");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    Session会话追踪的实现机制
    MFC 静态库导入,动态库导入方式
    【Vue】Vue项目需求--实现搜索框输入防抖处理
    【Vue】eventbus 首次$on事件未绑定问题
    [极客大挑战 2019]BuyFlag
    sql server 2008 安装,java jdbc 连接测试
    final关键字java
    操作系统——进程同步和进程互斥中的经典问题
    RocketMQ源码解析(下 )
    创建数据库表及修改删除数据表字段
  • 原文地址:https://blog.csdn.net/same_life/article/details/125465219