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

2020-07-18  本文已影响0人  我是小胡胡123

一、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方法中,重新配置界面

上一篇 下一篇

猜你喜欢

热点阅读