美文网首页
2020-07-18 iOS适配黑暗模式

2020-07-18 iOS适配黑暗模式

作者: 我是小胡胡分胡 | 来源:发表于2020-07-18 03:39 被阅读0次

    一、darkMode适配场景

    1、业务类型分: 图片,文本, 颜色

    2、代码层面划分为: 视图,控制器,字符串

    1,UIView,CALayer
    2,UIWindow
    3,UIViewController
    4,NSString/NSAttributeString

    二、功能

    1, 开关

    开关如何开启/关闭

    1、属性设置

    UIView/UIViewController 都有overrideUserInterfaceStyle属性

    UIUserInterfaceStyleLight //普通模式
    UIUserInterfaceStyleDark //深色模式
    UIUserInterfaceStyleUnspecified //当前系统的模式

    // 开启/关闭

    self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;//控制器,present和push 新的控制器不受影响,上面的所有视图有效,包括childViewController

    self.view.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;//视图,覆盖所有子视图配置

    self.view.window.userInteractionEnabled = UIUserInterfaceStyleLight;// 所有界面有效,覆盖所有界面。view/viewController

    2、重写getter方法

    // 开启/关闭 重写方法

    - (UIUserInterfaceStyle)overrideUserInterfaceStyle {
     return UIUserInterfaceStyleLight;
    }
    

    2, 开关的作用控制范围

    1,window 〉 所有界面
    2,控制器 〉 所有view,
    3,控制器 〉 push的控制器,tabbarController的各子控制器,普通viewController添加的子控制器 ?
    不能控制present弹出的控制器 ?
    4,view 〉 所有子view

    3, 开关overrideUserInterfaceStyle属性修改后,如何通知界面刷新

    三、实现

    1、通用--UIView/UIViewController

    系统的模式切换后,或者界面被渲染时候,
    在回调方法中,可以拿到当前模式

    针对深色/正常模式, 手动重新设置界面样式,适配展现需求

    // 回调-
    - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
     [super traitCollectionDidChange:previousTraitCollection];
    
     if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
    
         if (UIUserInterfaceStyleDark == self.traitCollection.userInterfaceStyle) {
    
         }
     }
    }
    

    2、图片

    UIImage -》支持配置两套图片, 模式修改后, 系统会自动get图片,修改界面
    可以理解为UIImageView对image属性添加了观察者, 针对当前模式,自动提取对应的图片,渲染UIImageView视图

    xcassets 支持添加两套图片
    代码层面,可以注册的方式实现添加两套图片

    UIImage *image = [UIImage new];
    if (@available(iOS 13.0, *)) {
     [image.imageAsset registerImage:[UIImage imageNamed:@"light"] withTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleLight]];
     [image.imageAsset registerImage:[UIImage imageNamed:@"dark"] withTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleDark]];
    } else {
     image = [UIImage imageNamed:@"light"];
    }
    

    3、颜色

    UIColor -》 支持配置两套颜色

    xcassets 支持添加两套颜色
    代码层面,可以注册的方式实现两套颜色

    UIColor *color = [UIColor new];
    if (@available(iOS 13.0, *)) {
     color = [UIColor colorWithDynamicProvider:^UIColor *_Nonnull (UITraitCollection *_Nonnull traitCollection) {
         if (traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
             return [UIColor darkGrayColor];//dark
         }
         return [UIColor lightGrayColor];//light
     }];
    } else {
     color = [UIColor lightGrayColor];
    }]
    

    4、文字--〉UILabel等,

    在traitCollectionDidChange方法中,重新配置界面

    相关文章

      网友评论

          本文标题:2020-07-18 iOS适配黑暗模式

          本文链接:https://www.haomeiwen.com/subject/flgahktx.html