一.bug展示
Xcode 升級到 版本后,公司中的項目運行到iOS11的設(shè)備上出現(xiàn)了一個UI Bug,原來自動適配tableview的內(nèi)間距失效了. 很顯然,tableView有了額外的內(nèi)邊距.代碼運行到之前的環(huán)境上是沒問題的,可用Xcode9一編譯,再跑到iOS11上就會出現(xiàn)問題...
二.問題產(chǎn)生原因
先貼一段設(shè)置tableView的代碼
private func setupTableView() { tableView = UITableView() tableView.frame = view.bounds tableView.dataSource = self tableView.delegate = self tableView.backgroundColor = UIColor.red extendedLayoutIncludesOpaqueBars = true; automaticallyAdjustsScrollViewInsets = false; // 設(shè)置tableView的內(nèi)邊距(能夠顯示出導(dǎo)航欄和tabBar下覆蓋的內(nèi)容) tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0) // 設(shè)置內(nèi)容指示器(滾動條)的內(nèi)邊距 tableView.scrollIndicatorInsets = tableView.contentInset } 關(guān)于extendedLayoutIncludesOpaqueBars和automaticallyAdjustsScrollViewInsets
這兩個屬性屬于UIViewController 默認(rèn)情況下extendedLayoutIncludesOpaqueBars = false 擴展布局不包含導(dǎo)航欄 默認(rèn)情況下automaticallyAdjustsScrollViewInsets = true 自動計算滾動視圖的內(nèi)容邊距 但是,當(dāng) 導(dǎo)航欄 是 不透明時,而tabBar為透明的時候,為了正確顯示tableView的全部內(nèi)容,需要重新設(shè)置這兩個屬性的值,然后設(shè)置contentInset(參考代碼). 上面的代碼邏輯沒有問題,但是放到iOS11 上為啥錯了呢? 找了半天,點開了automaticallyAdjustsScrollViewInsets 這個屬性,發(fā)現(xiàn)這個屬性在iOS11過期了,如圖:
在OC的聲明中,這個屬性是這樣的: @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(),tvos()); // Defaults to YES 這說明在iOS11 中, UIViewController的automaticallyAdjustsScrollViewInsets屬性已經(jīng)不再使用,我們需要使用UIScrollView的 contentInsetAdjustmentBehavior 屬性來替代它.
關(guān)于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會自動計算和適應(yīng)頂部和底部的內(nèi)邊距并且在scrollView 不可滾動時,也會設(shè)置內(nèi)邊距. scrollableAxes 自動計算內(nèi)邊距. never不計算內(nèi)邊距 always 根據(jù)safeAreaInsets 計算內(nèi)邊距 很顯然,我們這里要設(shè)置為 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;
(正文已結(jié)束)
推薦閱讀:西安信息網(wǎng)
免責(zé)聲明及提醒:此文內(nèi)容為本網(wǎng)所轉(zhuǎn)載企業(yè)宣傳資訊,該相關(guān)信息僅為宣傳及傳遞更多信息之目的,不代表本網(wǎng)站觀點,文章真實性請瀏覽者慎重核實!任何投資加盟均有風(fēng)險,提醒廣大民眾投資需謹(jǐn)慎!