暗夜模式导致APP出现的一些小问题(我自己遇见的)
1、UITextField文字颜色变化,taBarItem设置选中颜色无用,状态栏颜色的问题。
2、presentViewController推出的视图为叠层。
3、视图的背景颜色变化
4、UITextField通过KVC方式修改空白提示语颜色崩溃
5、其他的一些问题。
解决暗夜模式的问题你可以关闭暗夜模式或者去做暗夜模式的适配
关闭暗夜模式
在info.plist文件中添加
<key>UIUserInterfaceStyle</key>
<string>UIUserInterfaceStyleLight</string>
但是这个时候需要你可能需要设置一下状态栏的颜色或者其他的自己设置的一些小地方,如:
if (@available(iOS 13.0, *)) {
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDarkContent;//可以根据自己的需求改变
} else {
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
}
presentViewController推出的视图为叠层
出现这个问题是因为在iOS13之前展示的方式 modalPresentationStyle 的值默认为0,即 UIModalPresentationFullScreen。而此时,在 iOS13 中变为了-2即UIModalPresentationAutomatic。
所以我们需要在相应展示的viewController的构造方法里面设置为UIModalPresentationFullScreen即可。如:
- (instancetype)init
{
self = [super init];
if (self) {
self.modalPresentationStyle = UIModalPresentationFullScreen;
}
return self;
}
UITextField通过KVC方式修改空白提示语颜色 崩溃
[UITextField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor”];
这是因为私有API被封禁(KVC限制),禁止访问,可以使用attributedPlaceholder来解决。
NSMutableAttributedString *mutAttString = [[NSMutableAttributedString alloc] initWithString:placeString attributes:@{NSForegroundColorAttributeName:[UIColor greenColor]}];
nameTextField.attributedPlaceholder = mutAttString;
暗夜模式的简单适配
1、图片资源的适配
① 可以在Assets.xcassets文件里的图片添加暗夜模式图片的适配。
③ 使用的方式不变,系统会根据模式自己取相应的图片。
2、颜色的适配(UIColor)
+ (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
- (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
例如:
//返回自己对应模式的相应的颜色
[UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trait) {
if (trait.userInterfaceStyle == UIUserInterfaceStyleDark) {
return colorWithHexString(@"000000");
} else {
return colorWithHexString(@"FFFFFF");
}
}];
视图颜色的适配
这个很简单就放在相应的视图的更新样式的触发的方法里面就好了。例如layoutSubviews()、updateViewConstraints()、viewDidLayoutSubviews()、containerViewDidLayoutSubviews()等这些方法里面,根据自己的需求在对应的方法里面修改就好了。
单个界面不好适配,可以关闭单个界面的暗夜模式适配,这个很简单,改变要不需适配暗夜模式的界面的overrideUserInterfaceStyle值就好了。
注意
设置 ViewController 的overrideUserInterfaceStyle属性值, 将会影响视图控制器的视图和该视图控制器的子视图控制器采用该样式。
设置 View 的该属性, 将会影响视图及其所有子视图采用该样式。
设置 Window 的该属性, 将会影响窗口中的所有内容都采用样式,包括根视图控制器和在该窗口中显示内容的所有演示控制器(UIPresentationController)