適配iOS11--contentInsetAdjustmentBehavior
一.bug展示
Xcode 升級到 9.0beta版本後,公司中的專案執行到iOS11的裝置上出現了一個UI Bug,就像下面這種情況.
很顯然,tableView有了額外的內邊距.程式碼執行到之前的環境上是沒問題的,可用Xcode9一編譯,再跑到iOS11上就會出現這麼嚴重的問題...
二.問題產生原因
先貼一段設定tableView的程式碼
private func setupTableView() {
tableView = UITableView()
tableView.frame = view.bounds
tableView.dataSource = self
tableView.delegate = self
tableView.backgroundColor = UIColor.red
// 公司的專案中導航欄是不透明的,所以需要加上這兩行程式碼,我們自己來計算scrollView的內邊距
extendedLayoutIncludesOpaqueBars = true;
automaticallyAdjustsScrollViewInsets = false;
// 設定tableView的內邊距(能夠顯示出導航欄和tabBar下覆蓋的內容)
tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0)
// 設定內容指示器(滾動條)的內邊距
tableView.scrollIndicatorInsets = tableView.contentInset
}
關於extendedLayoutIncludesOpaqueBars
和automaticallyAdjustsScrollViewInsets
- 這兩個屬性屬於UIViewController
- 預設情況下
extendedLayoutIncludesOpaqueBars = false
擴充套件布局不包含導航欄 - 預設情況下
automaticallyAdjustsScrollViewInsets = true
自動計算滾動檢視的內容邊距 - 但是,當 導航欄 是 不透明時,而tabBar為透明的時候,為了正確顯示tableView的全部內容,需要重新設定這兩個屬性的值,然後設定contentInset(參考程式碼).
上面的程式碼邏輯沒有問題,但是放到iOS11 上為啥錯了呢?
找了半天,點開了automaticallyAdjustsScrollViewInsets
這個屬性,發現這個屬性在iOS11過期了,如圖:
在OC的宣告中,這個屬性是這樣的:@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES
這說明在iOS11 中, UIViewController的automaticallyAdjustsScrollViewInsets
屬性已經不再使用,我們需要使用UIScrollView的 contentInsetAdjustmentBehavior
屬性來替代它.
關於contentInsetAdjustmentBehavior
@available(iOS 11.0, *)
public enum UIScrollViewContentInsetAdjustmentBehavior : Int {
case automatic // Similar to .scrollableAxes, but will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewContentInset = YES inside a navigation controller, regardless of whether the scroll view is scrollable
case scrollableAxes // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)
case never // contentInset is not adjusted
case always // contentInset is always adjusted by the scroll view's safeAreaInsets
}
UIScrollViewContentInsetAdjustmentBehavior 是一個列舉型別,值有以下幾種:
-
automatic
和scrollableAxes一樣,scrollView會自動計算和適應頂部和底部的內邊距並且在scrollView 不可滾動時,也會設定內邊距. -
scrollableAxes
自動計算內邊距. -
never
不計算內邊距 -
always
根據safeAreaInsets 計算內邊距
很顯然,我們這裡要設定為never
三.開始適配
swift 中
private func setupTableView() {
tableView = UITableView()
tableView.frame = view.bounds
tableView.dataSource = self
tableView.delegate = self
tableView.backgroundColor = UIColor.red
extendedLayoutIncludesOpaqueBars = true;
if #available(iOS 11.0, *) {
tableView.contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false;
};
tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0)
tableView.scrollIndicatorInsets = tableView.contentInset
}
OC 中
self.extendedLayoutIncludesOpaqueBars = YES;
if (@available(iOS 11.0, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
_tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0);
_tableView.scrollIndicatorInsets = _tableView.contentInset;
就是這麼簡單,如果幫你解決了問題或者提供一些思路的話麻煩給個小心鼓勵一下,回見~
相關文章
- Android適配: 拉伸適配的缺點Android
- flutter 螢幕尺寸適配 字型大小適配Flutter
- Android適配Android
- dimens適配
- iphoneX適配iPhone
- Android螢幕適配(理論適配100%機型)Android
- WebView iPhoneX適配WebViewiPhone
- iphoneX,XsMax適配iPhone
- 裝置適配
- 適配問題
- 螢幕適配
- android螢幕適配三:通過畫素密度適配Android
- 移動端適配
- rem 適配佈局REM
- h5適配H5
- Android圖示適配Android
- Rem 等比適配始末REM
- AutoLayout螢幕適配
- 關於字型適配
- android 螢幕適配Android
- android全面屏適配Android
- Android P 適配指南Android
- Flutter螢幕適配Flutter
- pc大屏適配
- Flutter深色模式適配Flutter模式
- Unity適配iPhone X---關於Home鍵指示器適配UnityiPhone
- (原創)高DPI適配經驗系列:(四)高DPI適配示例
- 應用適配資料庫還是資料庫適配應用資料庫
- (原創)高DPI適配經驗系列:(二)按DPI範圍適配
- Android中的icon適配Android
- viewport移動端適配View
- Android6.0~9.0適配Android
- Android Q 提前適配攻略Android
- rem移動端適配REM
- Android適配:DP簡述Android
- vw移動端適配
- Flutter適配深色模式(DarkMode)Flutter模式
- Android 劉海屏適配Android