【iOS开发诡异问题】TabBar上添加一个View并自动布局,当遇到popViewController:animated:false的时候,页面错乱

现象

  在之前的开发中遇到一个比较诡异的问题(对应业务:App中,TabBar显示未读小红点),在一个 UITabBarController -> UINavigationViewController -> UIViewController 的页面结构中,如果在 UITabBarController.tabBar 上添加了一个子View,并且子View或者子View中的子View采用了自动布局,当 UINavigationViewController.pushViewController 后,再在新Push出来的UIViewController中 popViewController(animated: false) ,注意这里不要Pop的动画,则返回到上一个页面的时候,前一个UIViewController的View,底部布局就会往上挪动一块。

页面结构

  页面结构如下:


【iOS开发诡异问题】TabBar上添加一个View并自动布局,当遇到popViewController:animated:false的时候,页面错乱_第1张图片
页面结构

  Push到下一个页面后的效果:


【iOS开发诡异问题】TabBar上添加一个View并自动布局,当遇到popViewController:animated:false的时候,页面错乱_第2张图片
页面结构

  Pop回上一个页面的效果:
【iOS开发诡异问题】TabBar上添加一个View并自动布局,当遇到popViewController:animated:false的时候,页面错乱_第3张图片
问题页面

出现该问题的关键点

  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

你可能感兴趣的:(【iOS开发诡异问题】TabBar上添加一个View并自动布局,当遇到popViewController:animated:false的时候,页面错乱)