iOS中TabBar顯示模式VC時切換TabItem的奇怪行為
阿新 • • 發佈:2018-12-14
本貓App的UI層次大致如下:
- TabBarVC
- NavVC
- 若干子VC
- NavVC
- 若干子VC
- NavVC
- 若干子VC
- NavVC
- 若干子VC
- NavVC
- 若干子VC
- NavVC
各個VC之間切換都很正常,但最近測試時偶然發現在VC0中的某個子VC裡,呼叫present顯示模態VC時,出現自動切換TabItem的行為:
第二次彈出VC後,TabBarVC當前顯示的VC出現黑屏。
這個現象很怪異,簡單搜了一下,基本沒有人遇到同樣的情況。所以可以排除iOS系統BUG的原因,應該是自己程式碼哪裡有問題。
使用git回退到上一版本,發現無此問題!!!用git diff比較版本差異,發現如下方法有所區別:
override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() enterLayoutTimes += 1 if enterLayoutTimes == 2{ //需要將TabBar背景圖片放到layout例程裡來設定,在didLoad中不會有效 self.tabBar.backgroundImage = UIImage(named: "background_dark") //2.第二次進入:然後再切換回第一個VC,這樣做的目的是使得ESTabBarController中初始選擇不會"僵住" self.selectedIndex = 0 //3.遞增enterLayoutTimes變數,使其大於2,可以開始自定義轉場動畫的顯示了。 enterLayoutTimes += 1 }else{ //1.第一次進入:需要首先選擇TabBar的第二個VC self.selectedIndex = 1 } }
注意其中註釋line 1,應該是will layout未準備充分時就切換了TabBarVC。
我們將第一次選擇VC的時機放到will appear中:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.selectedIndex = 1
}
這樣就解決了本博所述的問題。
有人可能奇怪,為毛要大費周章在TabBarVC初始化時反覆切換VC?這是因為我使用了第三方的ESTabBarController類,該類在作為根VC時,如果不在初始化中做這樣一個切換,則其在TabBar中Item的動畫圖示行為就會不正常。
that’s why!