合理使用API很重要(記錄一個問題排查過程)
前言
你永遠(yuǎn)不知道,可能是你隨便添加的一行代碼,對后續(xù)的開發(fā)造成了多大的麻煩,甚至上升到了懷疑原生設(shè)計者的bug。所以請謹(jǐn)慎添加代碼,并且了解你添加代碼之后的影響范圍;如果是局部可控的那最好,如果是全局不可控的,我建議你最好別添加,因為別的地方的開發(fā)出現(xiàn)問題根本聯(lián)想不到是你這里出現(xiàn)的問題,這真的是坑死后人。
起因
最近因為同事開發(fā)的下拉顯示二樓架構(gòu)不合理,導(dǎo)致出現(xiàn)必現(xiàn)且不改架構(gòu)無法解決的問題,我來接手重新架構(gòu),保證架構(gòu)的合理性、可維護(hù)性。
架構(gòu)如何不合理,新架構(gòu)又是如何架構(gòu),不是本次的重點,就不再這里贅述。
這次主要一下,之后出現(xiàn)的奇怪現(xiàn)象。
當(dāng)下滑到某個位置后松手,需要整個tableView做個動畫向下位移,移出屏幕。展示背景view,且實現(xiàn)轉(zhuǎn)場到二樓頁面。
但是奇怪的事情就此發(fā)生了:
1. 當(dāng)我去修改contentInset.top為screenHeight且 設(shè)置contentOffset 為(0, -screenHeight), 即滾動到屏幕下沿。莫名的會先達(dá)到最下沿,然后回彈一段距離。
2.當(dāng)個人中心的頁面切回首頁后,tableView 會自動調(diào)整 contentInset 頂部增加44, 底部增加一段距離
3.不同設(shè)備首次進(jìn)入首頁,會自動向下便宜44的距離
排查
-
首先想到的是:是不是其他地方設(shè)置contentOffset或者contentInset
問題1之后的所有設(shè)置contentInset和contentOffset的地方,并沒有發(fā)現(xiàn)有任何異樣
-
然后通過以上排查,那么肯定就是tableView 主動調(diào)整了自己的contentInset
那么首先想到的是,限制scrollView主動調(diào)整inset的屬性,contentInsetAdjustmentBehavior 發(fā)現(xiàn)也設(shè)置為了never, 那么沒有理由會自動調(diào)整啊,難道是tableView出現(xiàn)了系統(tǒng)性的bug?
開始各種網(wǎng)上搜這類型的bug,基本上都是忘記設(shè)置contentInsetAdjustmentBehavior為never導(dǎo)致的,但是我們設(shè)置了???
破迷
難道真的是tableView的bug?難道說是contentInsetAdjustmentBehavior 失效了?
OK,那么我在viewWillAppear里重新設(shè)置下:
public override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.contentInsetAdjustmentBehavior = .never
}
奇跡發(fā)生了,沒問題了。
難道說真的是系統(tǒng)出現(xiàn)問題了?系統(tǒng)會再次進(jìn)入的時候打開了自動調(diào)整contentInset?說不通啊,要是這樣的話那么早有問題了
我仔細(xì)回想了,前前后后發(fā)生的現(xiàn)象,問題2-個人中心tab切回首頁Tab,會出現(xiàn)自動便宜,那么他們之間又有什么關(guān)系呢?
會不是首頁不知道的地方打開了contentInsetAdjustmentBehavior?
全局搜一下?一搜謎團(tuán)終于解開了:
在個人中心的頁面發(fā)現(xiàn)了一行代碼
- (void)setupUI {
[UIScrollView appearance].contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentAutomatic;
...
}
OMG? 怎么能在這全局打開自動調(diào)整contentInset的屬性呢?
好了,謎團(tuán)解開了,前人挖坑后人填,在個人中心里添加了全局修改scrollView的contentInsetAdjustmentBehavior 為自動調(diào)整,
首頁是比個人中心加載快的,也就是說,當(dāng)首頁將自己的tableView設(shè)置為never后,在個人中心頁面加載的時候?qū)⑷衷O(shè)置為auto,相當(dāng)于重新打開,那tableView不自動調(diào)整才怪...
結(jié)語
我思前想后,前人在這加這個的動機(jī)是什么?如果你想全局設(shè)置也不應(yīng)該在這,最起碼得在最顯眼的地方比如AppDelegate,但是我不建議設(shè)置。那么我覺得只有一種動機(jī),他剛好在哪看到了這個API,覺得很新穎,嘗試一下,并沒有了解他背后的影響力是全局的。所以奉勸一些不太成熟的開發(fā)者,不光使用API,最好是了解其背后的含義以及影響,你偶爾增加的一行代碼,會給后續(xù)的開發(fā)者帶來極大痛苦。