tableView的約束我是這樣寫的:
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(myAddressLabel.mas_bottom);
make.left.right.bottom.mas_offset(0);
}];
tableView滾動的時候是這種效果:
但是當tableView滾動到最底部的時候汽绢,最后一個cell被擋住了:
于是我針對iOS 11調(diào)整了一下約束:
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(myAddressLabel.mas_bottom);
make.left.right.mas_offset(``0``);
if
(@available(iOS ``11.0``, *)) {
make.bottom.mas_equalTo(self.view.mas_safeAreaLayoutGuideBottom);
} else``{
make.bottom.mas_equalTo(self.view);
}
}];
|
OK淤击,現(xiàn)在就不會擋住最后一個cell了:
但是滾動tableView的時候又尷尬了:
對比這張GIF與上一張GIF画恰,可以發(fā)現(xiàn)這里根本沒有體現(xiàn)iPhone X全面屏的優(yōu)勢策肝。
對比這張GIF與上一張GIF,可以發(fā)現(xiàn)這里根本沒有體現(xiàn)iPhone X全面屏的優(yōu)勢椭微。
真正的適配iPhone X,是滾動的時候全屏滾動(如第一張GIF)盲链,滾到底的時候最后一個cell也不會被home_indicator擋住蝇率。
寫了個demo研究
為了方便弄清問題我新建了一個小demo,demo里我并沒有對約束做什么特殊處理:
UITableView *tableView = [[UITableView alloc] init];
[self.view addSubview:tableView];
tableView.dataSource = self;
tableView.delegate = self;
[tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_offset(NAVIGATION_BAR_HEIGHT);
make.left.right.bottom.mas_offset(``0``);
}];
|
demo的效果:
[圖片上傳中...(image-9c76fa-1517633860840-6)]
demo.gif
這才是我想要的效果肮粽础本慕!
我很疑惑,同樣的約束代碼我用在項目里怎么就不對了侧漓。
當初為了適配iOS 11锅尘,你做了什么?
后來我把這個問題發(fā)到群里布蔗,我同學問我是不是用了automaticallyAdjustsScrollViewInsets藤违。
這個屬性我有用到,但是iOS 11出來后我就沒用了纵揍,我用了另一個:
contentInsetAdjustmentBehavior
iOS 11剛出來的時候顿乒,我發(fā)現(xiàn)項目中的scrollView(及其子類)在iOS 11虛擬機上的偏移量發(fā)生了變化,那個時候關(guān)于適配iOS 11的文章很多泽谨,我也很輕松的找到了解決方案:
- 在AppDelegate.m中加上這段代碼:
if
(@available(iOS ``11``, *)) {
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
scrollView在iOS 11上的偏移問題就解決了璧榄,這段代碼是什么意思我并未研究特漩,只是從其字面意思上感覺它就是讓scrollView不要發(fā)生偏移,但是我并沒意識到它跟安全區(qū)域有關(guān)骨杂。
繞不過的安全區(qū)域
關(guān)于安全區(qū)域的文章有很多了涂身,相信大家就算沒仔細研究過,零散的文章也讀了不少搓蚪,這里給大家推薦一篇:
http://www.reibang.com/p/63c0b6cc66fd
現(xiàn)在來說下[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever和安全區(qū)域的關(guān)系蛤售。
自己翻譯:是否根據(jù)安全區(qū)域調(diào)整偏移量,默認是自動調(diào)整的陕凹。
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever這句話的意思就是所有scrollView的偏移量不隨安全區(qū)域而調(diào)整悍抑。
這就是項目里的scrollView翻到底的時候最后一個cell會被home_indicator擋住的原因。
又因為contentInsetAdjustmentBehavior的默認值是UIScrollViewContentInsetAdjustmentAutomatic杜耙,所以小demo里tableView自動調(diào)整了偏移量搜骡,因此翻到底的時候最后一個cell不會被home_indicator擋住。
所以要解決項目里的tableView的顯示問題佑女,只需要將這個tableView的contentInsetAdjustmentBehavior改為UIScrollViewContentInsetAdjustmentAutomatic:
if
(@available(iOS ``11.0``, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
}
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(myAddressLabel.mas_bottom);
make.left.right.bottom.mas_offset(``0``);
}];
|
反思
最初適配iPhone X的時候记靡,我的想法很簡單:
iPhone X嘛,無非就是狀態(tài)欄和tabbar的高度發(fā)生了變化团驱,多了一個home_indicator而已摸吠,幾個宏就搞定了:
|
// 判斷是否是iPhone X
#define iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(``1125``, ``2436``), [[UIScreen mainScreen] currentMode].size) : NO)
// 狀態(tài)欄高度
#define STATUS_BAR_HEIGHT (iPhoneX ? ``44``.f : ``20``.f)
// 導航欄高度
#define NAVIGATION_BAR_HEIGHT (iPhoneX ? ``88``.f : ``64``.f)
// tabBar高度
#define TAB_BAR_HEIGHT (iPhoneX ? (``49``.f+``34``.f) : ``49``.f)
// home indicator高度
#define HOME_INDICATOR_HEIGHT (iPhoneX ? ``34``.f : ``0``.f)
|
憑借這幾個宏,我把導航欄和tabbar高度一改嚎花,然后就想當然的認為完成了iPhone X的適配工作——在別人還在研究安全區(qū)域的時候寸痢。
當然,tableView是這樣的:
我想的是:home_indicator沒有擋住cell內(nèi)容就是適配完成了紊选。(還好APP的幾個主頁都是有tabbar的啼止,不存在這種問題,不然真的丑爆了兵罢。)
安全區(qū)域是什么献烦?我知道有這個東西,這東西重要嗎卖词?反正也不用(我都用宏解決了)巩那,懶得去管。
事實說明人終將為自己的無知付出代價此蜈。
誠如CepheusSun所說:
在適配 iPhone X 的時候首先是要理解 safe area 是怎么回事即横,盲目的 if iPhoneX{} 只會給之后的工作帶來更多的麻煩。
最后裆赵,再次強調(diào)
真正的適配效果是:
不是:
也不是:
希望我們都能做一個格物致知的開發(fā)者。
轉(zhuǎn)自 無夜之星辰