5.iOS13初探

iOS13初探

          • TextFIeld KVC的问题
          • presentViewController 的问题
          • 崩溃问题
          • DeviceToken 的问题
          • Dark 模式适配问题

iOS13测试版发布以后,老大让我赶紧也适配一下,就一番折腾,安装了ios13Btea测试版,Xcode直接添加ios13真机包,一运行,没有任何问题,网上说的TextFIeldKVC会崩溃,模态跳转的问题完全都不存在
重点:也就是说iOS13是完全兼容Xcode11之前的版本的,只有通过 Xcode11编译运行的才会有上述问题

以下问题都是建立在Xcode11iOS13之上的

TextFIeld KVC的问题
//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]}];


presentViewController 的问题

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的库都升级到最新版本

DeviceToken 的问题

菜鸟第一次从官网下载了一个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 模式适配问题

在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,但是很遗憾,这样做虽然能够解决部分背景,但是还有一部分还是需要单独设置,尤其是字体颜色

图片的适配:
5.iOS13初探_第1张图片那有人说,适配这个Dark模式太浪费时间了,要等UI重新设计, 效果还不一定好,那能不能强制设置Light(非Dark)模式呢

很肯定的告诉你:可以的

只需要在info.plist里加入:UserInterfaceStyle : UIUserInterfaceStyleLight
在这里插入图片描述那单个VC可不可设置强制设置呢

也是可以的:

self.overrideUserInterfaceStyle = UIUserInterfaceStyleDark

TabBar 字体颜色的问题

  1. Dark模式下,跳转界面返回以后,tabBarItem的字体变成了蓝色,改不了
    跳转前:
    5.iOS13初探_第2张图片跳转返回后:
    5.iOS13初探_第3张图片可以过一下代码解决:
//未选中下的颜色(ios10以后才有)
UITabBar.appearance.unselectedItemTintColor = [UIColor redColor];
//选中下的颜色(代替selectedImageTintColor)
UITabBar.appearance.tintColor = [UIColor orangeColor];

未解决的问题

  1. tabBar的setShadowImage不起作用,去不掉上边线
 UITabBarController * tabBC = [[UITabBarController alloc] init];
 [tabBC.tabBar setShadowImage:[self createImageWithColor:[UIColor orangeColor]]];
 [tabBC.tabBar setBackgroundImage:[self createImageWithColor:[UIColor whiteColor]]];

上述代码设置了tabBar的shadowImage为 orangeColor颜色的
事件结果如图,没有任何的效果,如果不设置默认是黑色的上边线:
5.iOS13初探_第4张图片

你可能感兴趣的:(iOS,基础知识)