2020-07-18 iOS适配黑暗模式
一、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方法中,重新配置界面