一.bug展示
Xcode 升級(jí)到 版本后,公司中的項(xiàng)目運(yùn)行到iOS11的設(shè)備上出現(xiàn)了一個(gè)UI Bug,原來自動(dòng)適配tableview的內(nèi)間距失效了. 很顯然,tableView有了額外的內(nèi)邊距.代碼運(yùn)行到之前的環(huán)境上是沒問題的,可用Xcode9一編譯,再跑到iOS11上就會(huì)出現(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)容指示器(滾動(dòng)條)的內(nèi)邊距 tableView.scrollIndicatorInsets = tableView.contentInset } 關(guān)于extendedLayoutIncludesOpaqueBars和automaticallyAdjustsScrollViewInsets
這兩個(gè)屬性屬于UIViewController 默認(rèn)情況下extendedLayoutIncludesOpaqueBars = false 擴(kuò)展布局不包含導(dǎo)航欄 默認(rèn)情況下automaticallyAdjustsScrollViewInsets = true 自動(dòng)計(jì)算滾動(dòng)視圖的內(nèi)容邊距 但是,當(dāng) 導(dǎo)航欄 是 不透明時(shí),而tabBar為透明的時(shí)候,為了正確顯示tableView的全部內(nèi)容,需要重新設(shè)置這兩個(gè)屬性的值,然后設(shè)置contentInset(參考代碼). 上面的代碼邏輯沒有問題,但是放到iOS11 上為啥錯(cuò)了呢? 找了半天,點(diǎn)開了automaticallyAdjustsScrollViewInsets 這個(gè)屬性,發(fā)現(xiàn)這個(gè)屬性在iOS11過期了,如圖:
在OC的聲明中,這個(gè)屬性是這樣的: @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 是一個(gè)枚舉類型,值有以下幾種:
automatic 和scrollableAxes一樣,scrollView會(huì)自動(dòng)計(jì)算和適應(yīng)頂部和底部的內(nèi)邊距并且在scrollView 不可滾動(dòng)時(shí),也會(huì)設(shè)置內(nèi)邊距. scrollableAxes 自動(dòng)計(jì)算內(nèi)邊距. never不計(jì)算內(nèi)邊距 always 根據(jù)safeAreaInsets 計(jì)算內(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)站觀點(diǎn),文章真實(shí)性請(qǐng)瀏覽者慎重核實(shí)!任何投資加盟均有風(fēng)險(xiǎn),提醒廣大民眾投資需謹(jǐn)慎!