tableView的約束我是這樣寫的:
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(myAddressLabel.mas_bottom);
make.left.right.bottom.mas_offset(0);
}];
tableView滾動(dòng)的時(shí)候是這種效果:

但是當(dāng)tableView滾動(dòng)到最底部的時(shí)候,最后一個(gè)cell被擋住了:

于是我針對(duì)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)在就不會(huì)擋住最后一個(gè)cell了:

但是滾動(dòng)tableView的時(shí)候又尷尬了:

對(duì)比這張GIF與上一張GIF,可以發(fā)現(xiàn)這里根本沒有體現(xiàn)iPhone X全面屏的優(yōu)勢(shì)。
對(duì)比這張GIF與上一張GIF,可以發(fā)現(xiàn)這里根本沒有體現(xiàn)iPhone X全面屏的優(yōu)勢(shì)。
真正的適配iPhone X,是滾動(dòng)的時(shí)候全屏滾動(dòng)(如第一張GIF),滾到底的時(shí)候最后一個(gè)cell也不會(huì)被home_indicator擋住。
寫了個(gè)demo研究
為了方便弄清問題我新建了一個(gè)小demo,demo里我并沒有對(duì)約束做什么特殊處理:
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
這才是我想要的效果??!
我很疑惑,同樣的約束代碼我用在項(xiàng)目里怎么就不對(duì)了。
當(dāng)初為了適配iOS 11,你做了什么?
后來我把這個(gè)問題發(fā)到群里,我同學(xué)問我是不是用了automaticallyAdjustsScrollViewInsets。
這個(gè)屬性我有用到,但是iOS 11出來后我就沒用了,我用了另一個(gè):
contentInsetAdjustmentBehavior
iOS 11剛出來的時(shí)候,我發(fā)現(xiàn)項(xiàng)目中的scrollView(及其子類)在iOS 11虛擬機(jī)上的偏移量發(fā)生了變化,那個(gè)時(shí)候關(guān)于適配iOS 11的文章很多,我也很輕松的找到了解決方案:
- 在AppDelegate.m中加上這段代碼:
if (@available(iOS ``11``, *)) {
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
scrollView在iOS 11上的偏移問題就解決了,這段代碼是什么意思我并未研究,只是從其字面意思上感覺它就是讓scrollView不要發(fā)生偏移,但是我并沒意識(shí)到它跟安全區(qū)域有關(guān)。
繞不過的安全區(qū)域
關(guān)于安全區(qū)域的文章有很多了,相信大家就算沒仔細(xì)研究過,零散的文章也讀了不少,這里給大家推薦一篇:
http://www.itdecent.cn/p/63c0b6cc66fd
現(xiàn)在來說下[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever和安全區(qū)域的關(guān)系。
自己翻譯:是否根據(jù)安全區(qū)域調(diào)整偏移量,默認(rèn)是自動(dòng)調(diào)整的。
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever這句話的意思就是所有scrollView的偏移量不隨安全區(qū)域而調(diào)整。
這就是項(xiàng)目里的scrollView翻到底的時(shí)候最后一個(gè)cell會(huì)被home_indicator擋住的原因。
又因?yàn)閏ontentInsetAdjustmentBehavior的默認(rèn)值是UIScrollViewContentInsetAdjustmentAutomatic,所以小demo里tableView自動(dòng)調(diào)整了偏移量,因此翻到底的時(shí)候最后一個(gè)cell不會(huì)被home_indicator擋住。
所以要解決項(xiàng)目里的tableView的顯示問題,只需要將這個(gè)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的時(shí)候,我的想法很簡單:
iPhone X嘛,無非就是狀態(tài)欄和tabbar的高度發(fā)生了變化,多了一個(gè)home_indicator而已,幾個(gè)宏就搞定了:
|
// 判斷是否是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)
// 導(dǎo)航欄高度
#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)
|
憑借這幾個(gè)宏,我把導(dǎo)航欄和tabbar高度一改,然后就想當(dāng)然的認(rèn)為完成了iPhone X的適配工作——在別人還在研究安全區(qū)域的時(shí)候。
當(dāng)然,tableView是這樣的:

我想的是:home_indicator沒有擋住cell內(nèi)容就是適配完成了。(還好APP的幾個(gè)主頁都是有tabbar的,不存在這種問題,不然真的丑爆了。)
安全區(qū)域是什么?我知道有這個(gè)東西,這東西重要嗎?反正也不用(我都用宏解決了),懶得去管。
事實(shí)說明人終將為自己的無知付出代價(jià)。
誠如CepheusSun所說:
在適配 iPhone X 的時(shí)候首先是要理解 safe area 是怎么回事,盲目的 if iPhoneX{} 只會(huì)給之后的工作帶來更多的麻煩。
最后,再次強(qiáng)調(diào)
真正的適配效果是:

不是:

也不是:

希望我們都能做一個(gè)格物致知的開發(fā)者。
轉(zhuǎn)自 無夜之星辰