iOS13暗黑模式
1. 系统
默认开启了暗黑模式(已上线的不影响,是有了苹果大会说有了暗黑模式的下一次打包才会有)
1.1 如果你未适配好按钮模式,可以将其关闭掉(User Interface Style)
在info.plist 文件中加入相关配置即可
<key>UIUserInterfaceStyle</key>
<string>Light</string>
1.2 如果只是想适配某几个页面为暗黑模式的话,可以在当前页面中重写
- (UIUserInterfaceStyle)overrideUserInterfaceStyle{
return UIUserInterfaceStyleDark;
}
1.3 暗黑模式改变时会调用不同的方法,都有一个属性traitCollection和方法traitCollectionDidChange:
UIView
traitCollectionDidChange(_:)
layoutSubviews()
draw(_:)
updateConstraints()
tintColorDidChange()
UIViewController
traitCollectionDidChange(_:)
updateViewConstraints()
viewWillLayoutSubviews()
viewDidLayoutSubviews()
UIPresentationController
traitCollectionDidChange(_:)
containerViewWillLayoutSubviews()
containerViewDidLayoutSubviews()
2. 颜色
2.1 UIColor方法 在block方法里面做style判定即可
+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider;
- (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider;
注:同时系统也有一系列的自定义动态颜色 eg. labelColor secondaryLabelColor linkColor systembackgroundColor
2.2 UIColor +colorNamed:
需要在资源文件夹 Assets.xcassets中添加相应的颜色配置文件
点击+号按钮,选中 New Color Set,即可有一个颜色配置文件,在Appearances中选择属性Any, Dark 然后分别设置两种颜色即可
2.3 重写traitCollectionDidChange 方法监听
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
{// eg. layer 对应的颜色适配需要使用监听才有效
if (@available(iOS 13.0, *)) {
if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
// iOS13 暗黑模式
label.layer.borderColor = UIColor.redColor.CGColor;
} else {
// iOS13 普通模式
label.layer.borderColor = UIColor.yellowColor.CGColor;
}
} else {
label.layer.borderColor = UIColor.yellowColor.CGColor;
}
}
3. 图片
3.1 UIImage +imageNamed: 同(2.2)
3.2 使用属性imageAsset去设置暗黑模式图片
3.3 重写traitCollectionDidChange 方法监听 同(2.3)
4. 其他
4.1 状态栏适配
重写UIViewController中的 -preferredStatusBarStyle: 方法
返回类型 UIStatusBarStyle
UIStatusBarStyleDefault 默认为黑色,暗黑下为白色
UIStatusBarStyleLightContent 一直为白色
UIStatusBarStyleDarkContent 一直为黑色
如果要做到默认为白色,暗黑下为黑色,可以在该方法做style判定。暗黑模式变化是会回调该方法的
4.2 modelPreset
5. 测试
5.1 整个app 普通模式下是否正常 暗黑模式下是否正常
5.2 某个页面 普通模式(上一个页面普通模式页面)切换暗黑是否正常 暗黑重新切换普通是否正常
5.3 某个页面 暗黑模式(上一个页面暗黑模式页面)切换普通是否正常 普通重新切换暗黑是否正常
注: xcode 底部有个按钮(Environment Overrides),在平时断点debug的后面,查看图层也是这一块的按钮