現象
??在之前的開發中遇到一個比較詭異的問題(對應業務:App中,TabBar顯示未讀小紅點),在一個 UITabBarController -> UINavigationViewController -> UIViewController
的頁面結構中,如果在 UITabBarController.tabBar
上添加了一個子View,并且子View或者子View中的子View采用了自動布局,當 UINavigationViewController.pushViewController
后,再在新Push出來的UIViewController中 popViewController(animated: false)
,注意這里不要Pop的動畫,則返回到上一個頁面的時候,前一個UIViewController的View,底部布局就會往上挪動一塊。
頁面結構
??頁面結構如下:
頁面結構
??Push到下一個頁面后的效果:
頁面結構
??Pop回上一個頁面的效果:
問題頁面
出現該問題的關鍵點
??1、TabBar上添加了子View,并且子View或者子View中的View使用了自動布局
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let tabBarVC = self.window?.rootViewController! as! UITabBarController
tabBarVC.tabBar.isTranslucent = false
let redDotView: UIView = {
let view = UIView()
view.backgroundColor = .red
view.layer.cornerRadius = 10
return view
}()
// 在tabbar上添加view,并使用自動布局
tabBarVC.tabBar.addSubview(redDotView)
// redDotView.frame = CGRect(x: 100, y: 30, width: 20, height: 20)
redDotView.snp.makeConstraints { make in
make.left.equalTo(100)
make.top.equalTo(30)
make.height.width.equalTo(20)
}
return true
}
??2、在新Push出來的頁面進行Pop操作,并關閉動畫
@IBAction func popAction(_ sender: Any) {
self.navigationController?.popViewController(animated: false)
}
如何避免該問題
??從以上兩點出發:1、TabBar上的子View不使用自動布局;2、popViewController的時候開啟動畫。第二條比較難避免,畢竟某些業務還是要無動畫Pop的。
??至于這個問題是什么原因導致的,暫不清楚系統內部做了什么操作。
??Demo:https://github.com/ZhaoheMHz/PushPopAndTabBar