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