iOS13
测试版发布以后,老大让我赶紧也适配一下,就一番折腾,安装了ios13Btea
测试版,Xcode
直接添加ios13
真机包,一运行,没有任何问题,网上说的TextFIeld
的KVC
会崩溃,模态跳转的问题完全都不存在iOS13
是完全兼容Xcode11
之前的版本的,只有通过 Xcode11
编译运行的才会有上述问题
以下问题都是建立在Xcode11
,iOS13
之上的
//iOS13以前我们可以通过KVC 修改TextFiled的内部属性,例如:
[self.txtPhone setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
[self.txtPassword setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
//但是,在iOS13之后就会崩溃,需要改成下面这样:
self.txtPhone.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"登录手机号"attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]}];
self.txtPassword.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"请输入密码"attributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]}];
iOS13之前我们只要设置如下就可以了,至于模态的方式一般默认,有需要再调整:
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor orangeColor];
[self presentViewController:vc animated:YES completion:nil];
但是,iOS13以后上面这个代码,只模态出小卡片形式,如果需要之前一样还是满屏的的模态可设置如下:
vc.modalPresentationStyle = UIModalPresentationFullScreen;
这里还有个问题就是:在dismiss vc的时候,不会再走vc 的这两个方法,如果在这两个方法中有初始化或者重要逻辑的,就需要修改了
- (void)viewWillAppear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
[_LSDefaults sharedInstance]: unrecognized selector sent to class 0x1dfc01258
代码运行起来0~2分钟内,必然会出现这个崩溃,代码里所有sharedInstance的地方加了断点一个都没走,很绝望,最后通过注释代码的方式,终于找到问题所在了,是由于接入UM, 在设置UM的appkey的时候崩溃的:
[UMConfigure initWithAppkey:@"" channel:nil];
解决方法:升级UMCCommon到最新的2.1.1版本,最好呢,继承UM的库都升级到最新版本
菜鸟第一次从官网下载了一个iOS13 public测试版本的描述文件,安装以后,真机运行完全都不会走这个方法:
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
证书,push开关这些都没问题的,因为在非iOS13的手机上都是没问题的,也在开发群里咨询了大神,他们的都是可以的没有问题,最后菜鸟只能退回到iOS12.4, 真机运行时没问题的,说明手机没问题,再次下载iOS13 Beta5描述文件安装以后,再真机就能获取到deviceToken了,我也很无奈、、、、
iOS13 DeviceToken获取方法,来源于UM:
#include
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
if (![deviceToken isKindOfClass:[NSData class]]) return;
const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
NSLog(@"deviceToken:%@",hexToken);
}
在Dark模式下, app没有设置背景颜色的控件会呈现Dark模式的颜色,字体颜色会根据Dark模式自动变化。
设置了背景色的地方就需要进行适配:
UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
return [UIColor redColor];
}
else {
return [UIColor greenColor];
}
}];
[self.bgView setBackgroundColor:dyColor];
但是项目中,设置背景的地方太多了,改起来工作量很大,我试图通过Method Swizzling
进行重写:
+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
来达到适配dark,但是很遗憾,这样做虽然能够解决部分背景,但是还有一部分还是需要单独设置,尤其是字体颜色
图片的适配:
那有人说,适配这个Dark模式太浪费时间了,要等UI重新设计, 效果还不一定好,那能不能强制设置Light(非Dark)模式呢
很肯定的告诉你:可以的
只需要在info.plist
里加入:UserInterfaceStyle
: UIUserInterfaceStyleLight
那单个VC可不可设置强制设置呢
也是可以的:
self.overrideUserInterfaceStyle = UIUserInterfaceStyleDark
TabBar 字体颜色的问题:
//未选中下的颜色(ios10以后才有)
UITabBar.appearance.unselectedItemTintColor = [UIColor redColor];
//选中下的颜色(代替selectedImageTintColor)
UITabBar.appearance.tintColor = [UIColor orangeColor];
未解决的问题:
UITabBarController * tabBC = [[UITabBarController alloc] init];
[tabBC.tabBar setShadowImage:[self createImageWithColor:[UIColor orangeColor]]];
[tabBC.tabBar setBackgroundImage:[self createImageWithColor:[UIColor whiteColor]]];
上述代码设置了tabBar的shadowImage为 orangeColor颜色的
事件结果如图,没有任何的效果,如果不设置默认是黑色的上边线: