前言
環(huán)境
Xcode 13.0
iOS 15.0
在 升級xcode 13.0 之后,正式開始支持 iOS15音榜,就需要做適配 iOS15了柒凉,在 xcode 13.0 之前的就不會有什么影響的
UINavigationBar
用新 xcode13 編譯工程后,導航欄的問題比較明顯认臊,調(diào)試之后發(fā)現(xiàn)是 UINavigationBar 部分屬性的設置在 iOS15 上是無效的
查看導航欄特性 API:UINavigationBarAppearance 后發(fā)現(xiàn)寨辩,iOS15navigationBar 的相關屬性設置要通過實例 UINavigationBarAppearance 來實現(xiàn)吓懈,UINavigationBarAppearance 是 iOS13 更新的 API,應該有人已經(jīng)在用捣染,我們的應用兼容 iOS10 以上骄瓣,對于導航欄的設置還沒有使用 UINavigationBarAppearance停巷,如今在 iOS15 上失效耍攘,所以對于呈現(xiàn)的問題,做如下適配:
解決方法
主要是以下兩個屬性 (UINavigationController 的屬性)
// 靜止樣式
self.navigationBar.standardAppearance;
// 滾動樣式
self.navigationBar.scrollEdgeAppearance;
下面只列了 UINavigationController 主要處理代碼
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
// 常規(guī)頁面
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;
// 常規(guī)頁面
self.navigationController.navigationBar.standardAppearance = appearance;
}
appdelegate全局設置
(代碼大差不差式曲,此處就只列出 oc 的代碼)之前有人遇到導航欄隱藏的返回按鈕失效問題,備注里面也已經(jīng)解決缸榛,并做出說明
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-200, 0) forBarMetrics:UIBarMetricsDefault];
// iOS 15適配
if (@available(iOS 13.0, *)) {
UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
[appearance setBackgroundColor:[UIColor whiteColor]];
// UINavigationBarAppearance 會覆蓋原有的導航欄設置吝羞,這里需要重新設置返回按鈕隱藏,不隱藏可注釋或刪掉
appearance.backButtonAppearance.normal.titlePositionAdjustment = UIOffsetMake(-200, 0);
[[UINavigationBar appearance] setScrollEdgeAppearance: appearance];
[[UINavigationBar appearance] setStandardAppearance:appearance];
}
UITabbar
tabbar 的問題和 navigationBar 的問題屬于同一類内颗,tabbar 背景顏色設置失效
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;
}
}
TableView
iOS 15 的 UITableView 新增了一條新屬性:sectionHeaderTopPadding钧排, 默認會給每一個 section header 增加一個高度,當我們使用 UITableViewStylePlain 初始化 UITableView 的時候均澳,能發(fā)現(xiàn) sectionHeader 增高了 22px恨溜。
/// Padding above each section header. The default value is `UITableViewAutomaticDimension`.
@available(iOS 15.0, *)
open var sectionHeaderTopPadding: CGFloat
//iOS 15中tableView會給每一個section的頂部(header以上)再加上一個22像素的高度符衔,形成一個section和section之間的間距
swift
//為了配合以前的開發(fā)習慣,我們只需要在創(chuàng)建實例的時候進行對間距的設置即可
if #available(iOS 15.0, *) {
tableView.sectionHeaderTopPadding = 0
}
//或者appdelegate全局設置
if #available(iOS 15.0, *) {
UITableView.appearance().sectionHeaderTopPadding = 0
}
Objective-C
//為了配合以前的開發(fā)習慣糟袁,我們只需要在創(chuàng)建實例的時候進行對間距的設置即可
if (@available(iOS 15.0, *)) {
tableView.sectionHeaderTopPadding = 0;
}
//或者appdelegate全局設置
if (@available(iOS 15.0, *)) {
[UITableView appearance].sectionHeaderTopPadding = 0;
}