现象
在之前的开发中遇到一个比较诡异的问题(对应业务: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