iOS 13适配
[toc]
私有属性的禁止访问
UITextField
的私有属性 _placeholderLabel
被禁止访问了
textColor
[self.textField setValue:self.placeholderColor forKeyPath:@"_placeholderLabel.textColor"];
font
[self.textField setValue:[UIFont boldSystemFontOfSize:14] forKeyPath:@"_placeholderLabel.font"];
崩溃日志如下
'Access to UITextField's _placeholderLabel ivar is prohibited. This is an application bug'
只要是修改_placeholderLabel
就会崩溃,所以我们要修改placeholderLabel
需要用其他方法,有个富文本属性attributedPlaceholder
可以使用,我们可以定义这个来达到我们的要求。
这里我直接是创建一个分类UITextField+placeholder
来使用他UITextField+placeholder.h
1 | /// 修改text的placeholder 不需要访问私有属性 |
UITextField+placeholder.m
1 | - (void)changeplaceholde:(NSString *)holder text:(UITextField *)text{ |
访问私有属性statusbar也会奔溃
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
奔溃日志如下
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'App called -statusBar or -statusBarWindow on UIApplication: this code must be changed as there's no longer a status bar or status bar window. Use the statusBarManager object on the window scene instead.'
意思是不能通过UIApplication来获取到statusBar,提示推荐用statusBarManager来获取,所以我们可以改一下
1 | UIView *localStatusBar = [[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager performSelector:@selector(createLocalStatusBar)]; |
searchBar的textfield
新的iOS 13SDK 给searchBar新加了一个属性searchtextfield,方便开发者修改里面的一些东西,例如placeholder,font,color等。但这个属性在iOS 12上没有的,就是说你再Xcode11添加了这些方法,如果用低于Xcode11版本打开工程是会报错的。所以就要适配
if (iOS13available) {
// 这个只在iOS 13使用
[searchVC.searchBar.searchTextField changeSearchplaceholde:placeholder text:searchVC.searchBar.searchTextField];
searchVC.searchBar.searchTextField.backgroundColor = [UIColor whiteColor];
}
模态跳转默认方式改变
控制器的 modalPresentationStyle 默认值变了
1 | typedef NS_ENUM(NSInteger, UIModalPresentationStyle) { |
只是默认跳转方式变了,不再是全屏覆盖,而是这样的效果
如果你觉得这个好看就不用修改了,如果需求必须是全屏就修改跳转方式即可
self.modalPresentationStyle = UIModalPresentationOverFullScreen;
self.modalPresentationStyle = UIModalPresentationCustom;
以上两个都可以
MPMoviePlayerController 在iOS 13已经不能用了
'MPMoviePlayerController is no longer available. Use AVPlayerViewController in AVKit.'
既然不能再用了,那只能换掉了。替代方案就是AVKit里面的那套播放器。
iOS 13 DeviceToken有变化
1 | NSString *dt = [deviceToken description]; |
iOS 13这样获取
1 | - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken |
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.
苹果审核指南中明确在4.8 Sign In With 中指明,使用第三方登录。
官方新闻
黑夜模式
目前是苹果推荐使用黑夜模式,试了一下iOS 13系统下面,切换黑夜模式之后,部分界面背景颜色直接变成黑色,非常不友好,到时候如果审核会审核黑夜模式下的APP应用页面
代码中适配颜色(UIColor)
iOS 13SDK提供了一个新的API,colorWithDynamicProvider
这个方法在xcode 10以下没有,xcode11才会有,所以要使用这个方法,必须更新xcode。
+ (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+Collection
分类来方便使用它UIColor+Collection.h
1 | /// 自定义颜色 |
UIColor+Collection.m
1 | +(UIColor *)customColorWithDarkMode:(NSUInteger)drakValue AndLightMode:(NSUInteger)LightValue |
全局关闭黑暗模式
在Info.plist 文件中,添加
UIUserInterfaceStyle key
名字为User Interface Style
值为String
,将
UIUserInterfaceStyle key
的值设置为Light
UISearchBar显示问题
升级到iOS13,
UISearchController
上的SearchBar
显示异常,查看后发现对应的高度只有1px,目前没找到具体导致的原因,解决办法是使用KVO监听frame值变化后设置去应该显示的高度之前为了处理搜索框的黑线问题会遍历后删除
UISearchBarBackground
,在iOS13会导致UI渲染失败crash;解决办法是设置UISearchBarBackground
的layer.contents为nil2019.11.08补:iOS 13.1.3 UISearchBar 背景色问题
iOS 13 SearchBar背景色不修改默认白色 到13.1之后会默认透明 并且有点灰暗的感觉
所以这里需要适配SearchBar的颜色,iOS 13之后获取SearchBar的背景色简单了许多,
它有了searchTextField
属性,我们可以直接调用这个属性获取backgroundColor
,然后给他赋值颜色。searchVC.searchBar.searchTextField.backgroundColor = [UIColor whiteColor];
TabBar红点偏移
如果之前有通过TabBar上图片位置来设置红点位置,在iOS13上会发现显示位置都在最左边去了。遍历UITabBarButton
的subViews
发现只有在TabBar
选中状态下才能取到UITabBarSwappableImageView
,解决办法是修改为通过UITabBarButton
的位置来设置红点的frame
第三方友盟需要更新
此次适配iOS 13 只需升级common部分即可 具体更新查看友盟官网
个推
个推SDK需要更新,具体更新内容查看个推官网(预计9月1日之后可以更新)
UISegmentedControl 默认样式改变
默认样式变为白底黑字,如果设置修改过颜色的话,页面需要修改
App启动过程中,部分View可能无法实时获取到frame
可能是为了优化启动速度,App 启动过程中,部分View可能无法实时获取到正确的frame
使用 @available 问题
使用新的XCode SDK 工程的代码里面使用了 @available 判断当前系统版本,他总是弹出让你使用这个属性的问题,旧版本
if ([UIDevice currentDevice].systemVersion.floatValue >= 13.0) {
...
}
或者写个宏更方便
//判断 iOS 13
#define iOS13available ([UIDevice currentDevice].systemVersion.floatValue >= 13.0 ? YES : NO)
即将废弃的 LaunchImage
从 iOS 8 的时候,苹果就引入了 LaunchScreen,我们可以设置 LaunchScreen来作为启动页。当然,现在你还可以使用LaunchImage来设置启动图。不过使用LaunchImage的话,要求我们必须提供各种屏幕尺寸的启动图,来适配各种设备,随着苹果设备尺寸越来越多,这种方式显然不够 Flexible。而使用 LaunchScreen的话,情况会变的很简单, LaunchScreen是支持AutoLayout+SizeClass的,所以适配各种屏幕都不在话下。
注意啦⚠️,从2020年4月开始,所有使⽤ iOS13 SDK的 App将必须提供 LaunchScreen,LaunchImage即将退出历史舞台。
获取不到wifiSSID(wifi名)
1 | Dear Developer, |
苹果为了隐私安全,不让直接获取WiFi名字了,如果需要获取WiFi名字,需要获取地理位置信息,这个就去info.plist里面配置地理位置权限即可。
1 | #import <CoreLocation/CoreLocation.h> |
UITabBarItem底部字体颜色push时改变
1 | [[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor colorWithHexString:@"999999"]} forState:UIControlStateNormal]; |
原因可能是push时
self.hidesBottomBarWhenPushed = YES;
UIActivityIndicatorView加载视图
iOS13.1.3
对UIActivityIndicatorView的样式也做了修改
以前默认是白色,iOS 13.1.3
中会变成黑色
之前有三种样式:
- UIActivityIndicatorViewStyleGray 灰色
- UIActivityIndicatorViewStyleWhite 白色
- UIActivityIndicatorViewStyleWhiteLarge 白色(大型)
iOS13废弃了以上三种样式,而用以下两种样式代替:
- UIActivityIndicatorViewStyleLarge (大型)
- UIActivityIndicatorViewStyleMedium (中型)
iOS13通过color属性设置其颜色
@property (nonatomic, strong) UIActivityIndicatorView * activityIndicator;
配置属性
self.activityIndicator = [[UIActivityIndicatorView alloc] init];
[self.view addSubview:self.activityIndicator];
//设置小菊花的frame
self.activityIndicator.frame= CGRectMake(100, 100, 100, 100);
//设置小菊花颜色
self.activityIndicator.color = [UIColor redColor];
//设置背景颜色
self.activityIndicator.backgroundColor = [UIColor cyanColor];
//刚进入这个界面会显示控件,并且停止旋转也会显示,只是没有在转动而已,没有设置或者设置为YES的时候,刚进入页面不会显示
self.activityIndicator.hidesWhenStopped = NO;