一、iOS15新特性
1.1、iOS15兼容的设备
9.21 iOS15.0正式版
iPhone6S以上,包括SE第一/二代,iPod touch第七代
具体6s、6sPlus、7、7Plus、8、8plus、X、XR、XsMax、Xs、11、11Pro、11ProMax、12、12Pro、12ProMax、12mini、13、13Pro、13ProMax、13mini
1.2、iOS15新特性
专注模式,就是确保用户在一个时间段里屏蔽各种骚扰、非必要的内容不看不听,来提升做其他事情的效率。苹果做了各种细致分类,能进行量身定制。
NFC增强版 NFC能模拟公交卡、门禁卡等,能把手机强化为卡证管理平台,在中高端安卓手机很普及。苹果的NFC功能限制非常多,要与指定的开发商合作才能启用,故实用性低。
看图识字 图中文字能提取出来进行复制分享。
FaceTime 提供人物虚化功能、麦克风选收听人声或全场景声
二、iOS15适配
Xcode13编译工程后,问题:
2.1、NavigationBar
问题:导航栏问题比较明显,有的变白色,有的变黑色。(我们项目里有navigationBar原本白色现在变成灰色)
原因:UINavigationBar 部分属性的设置在 iOS15 上是无效的。
解决办法:查看导航栏API,iOS15的导航栏属性需用UINavigationBarAppearance(iOS13更新的API)来实现。
swift
if #available(iOS 13.0, *) {
let appearance = UINavigationBarAppearance()
// 设置导航栏背景色
appearance.backgroundColor = .white
// 去除导航栏阴影(如果不设置clear,导航栏底下会有一条阴影线)
appearance.shadowColor = UIColor.clear
// 字体颜色
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
// 带scroll滑动的页面
navigationController?.navigationBar.scrollEdgeAppearance = appearance
// 常规页面
navigationController?.navigationBar.standardAppearance = appearance
}
Objective-C
if (@available(iOS 13.0, *)) {
UINavigationBarAppearance * appearance = [[UINavigationBarAppearance alloc] init];
// 背景色
appearance.backgroundColor = [UIColor whiteColor];
// 去除导航栏阴影(如果不设置clear,导航栏底下会有一条阴影线)
appearance.shadowColor = [UIColor clearColor];
// 字体颜色
appearance.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor redColor]};
// 带scroll滑动的页面
self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
// 常规页面
self.navigationController.navigationBar.standardAppearance = appearance;
}
对NavigationBar是白底黑字的app影响不大
2.2、UITabBar
背景色失效 (这个问题在我们项目里其中一个tab下存在)
swift
if #available(iOS 13.0, *) {
let appearance = UITabBarAppearance()
// 背景色
appearance.backgroundColor = .white
tabBar.standardAppearance = appearance
if #available(iOS 15.0, *) {
tabBar.scrollEdgeAppearance = appearance
}
}
Objective-C
if (@available(iOS 13.0, *)) {
UITabBarAppearance * appearance = [[UITabBarAppearance alloc] init];
// 背景色
appearance.backgroundColor = [UIColor whiteColor];
self.tabBar.standardAppearance = appearance;
if (@available(iOS 15.0, *)) {
self.tabBar.scrollEdgeAppearance = appearance;
}
}
2.3 TableView
问题:a).初始化 UITableView用UITableViewStylePlain样式,发现 sectionHeader 增高了 22px
(这个问题在我们项目里也是有遇到的)
原因:iOS 15 的 UITableView 新增了一条新属性:sectionHeaderTopPadding, 默认会给每一个 sectionHeader 增加一个高度
解决办法:
swift代码
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = 0
}
Objective-C代码
if (@available(iOS 15.0, *)) {
tableView.sectionHeaderTopPadding = 0;
}
b).初始化 UITableView用UITableViewStylePlain样式,默认不显示灰色,上滑置顶时最上面的sectionHeader才有颜色。
解决办法:在viewForHeaderInSection代理方法返回自带灰色的section header
2.3.2、a)设置 tableHeaderView 后,底部会增加一段高度 (需验证)
解决方案:在设置tableHeaderView时同时设置一个高度为0.01的tableFooterView即可:
tableView?.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 0.01))
b)storyboard里的tableView,适配屏幕尺寸改tableHeaderView高度,调layoutIfNeeded不生效,只高度改了,布局没改。
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
if let headerView = self.tableView?.tableHeaderView, let lastSubView = headerView.subviews.last {
if #available(iOS 15.0, *) {
headerView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: lastSubView.frame.origin.y + lastSubView.frame.size.height)
self.tableView?.tableHeaderView = headerView
} else {
self.tableView?.tableHeaderView?.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: lastSubView.frame.origin.y + lastSubView.frame.size.height)
self.tableView?.tableHeaderView?.layoutIfNeeded()
}
}
}
2.4、UILabel
2.4.1、 NSBaselineOffsetAttributeName属性的值导致虽然约束没有问题但label内的文字位置不对
(这个问题在我们项目里有遇到的)
现在是以控件最上面的线为基准的偏移。所以用到这个属性的可以检查下。
2.4.2、NSMutableParagraphStyle的lineSpacing属性失效 解决办法加上换行符 \b或\n等
Xcode12打的包在iOS15显示无效,而Xcode13打的包在iOS15有效
if (@available(iOS 15,*)) {
NSAttributedString *placeholderChractor = [[NSAttributedString alloc] initWithString:@"\b"];
[as insertAttributedString:placeholderChractor atIndex:0];
}
[as addAttributes:@{NSParagraphStyleAttributeName: style} range:NSMakeRange(0, as.length)];
(这个问题在我们项目里有遇到的)
2.4.3、增加高度解决
iOS15计算的正好显示完Label文字高度,在IOS15显示不全,增加高度可解决。设置adjustsFontSizeToFitWidth为true时,高度不能与设置的font一样大,增加高度即可。(应该是Beta的问题 目前看正式版已修复)
2.5、检查用到的第三方库
如:第三方播放器框架ZFPlayer横屏出现问题,没有正确渲染布局,且无法切回竖屏页面
有几率闪退。第三方BRPickerView文字选择器内容布局错误。Facebook的跨平台框架React中的fishhook闪退。
解决办法:修改源码或看作者有没有适配
修改fishhook.c源码,参考https://github.com/facebook/fishhook/issues/85 中的XuweiQT的方案,将链接中的fishhook.c替换项目中fishhook.c文件
2.6、H5在WKWebView的显示问题
部分链接在iOS15的WKWebView、微信、QQ、Safari中出现空白页about:blank
(应该是Beta的原因,目前正式版没有遇到)
以上iOS15正式版有的适配问题,除NSMutableParagraphStyle的lineSpacing属性失效问题,和标记为Beta的外,其他用Xcode12编译打的包在IOS15设备使用不出现,而用Xcode13编译会出现问题
参考以下文章,感谢👍
【1】https://www.jianshu.com/p/10c7921e6d76
【2】https://www.jianshu.com/p/79ecec07d8d5
延伸:关于iOS新特性这里不多说了,可看以下这几篇比较详细。
iOS15系统如期而至,谈谈iPhone X手机适配性的使用感受 - 哔哩哔哩