請合理使用API(記錄一個問題排查過程)

合理使用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ā)者帶來極大痛苦。

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

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

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