iPhone X你真的適配了嗎?

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í)候是這種效果:

效果.gif

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

home_indicator擋住了cell的內(nèi)容

于是我針對(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了:

home_indicator不會(huì)擋住cell的內(nèi)容

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


尷尬.gif

對(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``);

}];

|

修改后.gif

反思

最初適配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是這樣的:

不是全面的全面屏.gif

我想的是: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)

真正的適配效果是:

正確姿勢(shì).gif

不是:

home_indicator擋住了最后一個(gè)cell.gif

也不是:

這還是全面屏嗎?.gif

希望我們都能做一個(gè)格物致知的開發(fā)者。

轉(zhuǎn)自 無夜之星辰

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一.iPhone X尺寸問題 1. 高度增加了145pt,變成812pt. 2.屏幕圓角顯示,注意至少留10pt邊...
    騎行天下閱讀 13,178評(píng)論 5 36
  • iOS 7 之后蘋果給 UIViewController 引入了 topLayoutGuide 和 bottomL...
    IOSCoderYummy閱讀 840評(píng)論 0 0
  • 我的朋友圈里有一位95后的姑娘,年紀(jì)輕輕的就謀上了一份特別好的工作,可能是名校畢業(yè),起點(diǎn)特別高。由于工作的需要,加...
    HedyWang1閱讀 204評(píng)論 0 0
  • 首先,我會(huì)很開心地與每一位關(guān)注“穢刊”成長的小伙伴們分享: 從此篇文章開始,“穢刊”終于擁有“原創(chuàng)”功能,這意味著...
    顏先生Yan閱讀 256評(píng)論 0 1
  • 百度上解釋,人性就是在一定社會(huì)制度和一定歷史條件下形成的人的本性。 朋友圈里刷滿了看完電影《釜山行》的真切感受,知...
    張某某T閱讀 616評(píng)論 2 4

友情鏈接更多精彩內(nèi)容