iOS13 (一)适配

一、模态弹出


present弹出效果图

在iOS13中modalPresentationStyle的默认改为UIModalPresentationAutomatic,而在之前默认是UIModalPresentationFullScreen。

要改会原来模态视图样式,我们只需要把UIModalPresentationStyle设置为UIModalPresentationFullScreen即可

如果是从控制器跳转的,这个属性设置在控制器,如果是封装了一个单独的导航栏跳转,则这个属性设置在导航栏

二、私有KVC


iOS不允许valueForKey、setValue: forKey获取和设置私有属性,需要使用其它方式修改

如:[textField setValue:[UIColor red]forKeyPath:@"_placeholderLabel.textColor"];

//替换为

textField.attributedPlaceholder =[[NSAttributedString alloc]initWithString:@"输入"attributes:@{NSForegroundColorAttributeName:[UIColor red]}];


三、苹果提供第三方登录


Sign in with Apple -提供第三方登录的注意啦

如果你的应用使用了第三方登录,那么你可能也需要加下 「Sign in with Apple」

Sign In with Apple will be available for beta testing this summer. It will be required as an option

for users in apps that support third-party sign-in when it is commercially available later this year.

如果苹果开发者提供任何其他第三方登录,同时需要提供“苹果登录”选项。也就是说,如果软件要求“微信登录”或是“QQ登录”时,必须同时提供“苹果登录”的选项给用户自行选择。根据苹果公司最新公布的指南,要求开发者在苹果终端的应用程序登录界面上,将“苹果登录”选项列在任何其他第三方登录的选项之上。

虽然这只是苹果的指南建议,并非苹果商店的审查要求,但是开发者认为这无疑是通过苹果审核的一个好方法

官方Demo:点我下载


四、UISearchBar显示问题


TextField

升级到iOS13,UISearchController上的SearchBar显示异常,查看后发现对应的高度只有1px,目前没找到具体导致的原因,解决办法是使用KVO监听frame值变化后设置去应该显示的高度

黑线处理crash

之前为了处理搜索框的黑线问题会遍历后删除UISearchBarBackground,在iOS13会导致UI渲染失败crash;解决办法是设置UISearchBarBackground的layer.contents为nil

publicfuncclearBlackLine(){

 forview inself.subviews.last!.subviews {

 ifview.isKind(of:NSClassFromString("UISearchBarBackground")!){

                view.backgroundColor =UIColor.white

                view.layer.contents =nil

 break } } }


五、TabBar红点偏移


如果之前有通过TabBar上图片位置来设置红点位置,在iOS13上会发现显示位置都在最左边去了。遍历UITabBarButton的subViews发现只有在TabBar选中状态下才能取到UITabBarSwappableImageView,解决办法是修改为通过UITabBarButton的位置来设置红点的frame


六、MPMoviePlayerController废弃

MPMoviePlayerController 在iOS 13已经不能用了

'MPMoviePlayerController is no longer available. Use AVPlayerViewController in AVKit.' 

解决方案:既然不能再用了,那只能换掉了。替代方案就是AVKit里面的那套播放器。(DDW使用的AVKit)


七、DeviceToken变化


iOS 13 DeviceToken有变化,原有的方法已经无法获取到准确的DeviceToken字符串了

NSString *dt = [deviceToken description];

dt = [dt stringByReplacingOccurrencesOfString: @"<" withString: @""];

dt = [dt stringByReplacingOccurrencesOfString: @">" withString: @""];

dt = [dt stringByReplacingOccurrencesOfString: @" " withString: @""];

这段代码运行在 iOS 13 上已经无法获取到准确的DeviceToken字符串了,iOS 13 通过[deviceToken description]获取到的内容已经变了。

解决方案

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{

    if (![deviceToken isKindOfClass:[NSData class]]) return;

    const unsigned *tokenBytes = [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);

}


八、LaunchImage废弃


即将废弃的 LaunchImage

从 iOS 8 的时候,苹果就引入了 LaunchScreen,我们可以设置 LaunchScreen来作为启动页。当然,现在你还可以使用

LaunchImage来设置启动图。不过使用LaunchImage的话,要求我们必须提供各种屏幕尺寸的启动图,来适配各种设备,

随着苹果设备尺寸越来越多,这种方式显然不够 Flexible。而使用 LaunchScreen的话,情况会变的很简单,

LaunchScreen是支持AutoLayout+SizeClass的,所以适配各种屏幕都不在话下。

注意啦,从2020年4月开始,所有使⽤ iOS13 SDK的 App将必须提供 LaunchScreen,LaunchImage即将退出历史舞台。


本文参考自:https://www.jianshu.com/p/46cd57b98b0d


如发现遗漏或者错误,请在下方评论区留言。

你可能感兴趣的:(iOS13 (一)适配)