iOS 13 去除模拟状态栏背景的UIView

iOS 13 remove UIView for simulate status bar background

我正在使用 UITableViewController 滚动时使导航栏消失。现在,当用户滑动 table 视图时导航栏被隐藏,单元格的内容显示在状态栏下方 ...

为了解决这个问题,我尝试插入一个 UIView 来模拟状态栏的背景,一切正常,但问题是当我关闭 UITableViewController 状态栏的背景视图时栏未从超级视图中删除

目前我的代码是这样的,你能帮我看看我哪里错了吗?为什么我不能从超级视图中删除 UIView

 override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        setupStatusBarView()

    }

    override func viewWillDisappear(_ animated: Bool) {
       super.viewWillDisappear(animated)

       navigationController?.navigationBar.isHidden = true
        UIApplication.shared.windows.first?.viewWithTag(1)?.removeFromSuperview()
   }


    //MARK: - Setup Status Bar View

    func setupStatusBarView() {

        let height = view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0

        let statusBarView = UIView()

        statusBarView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height:height+5)
        statusBarView.backgroundColor = .systemBackground
        statusBarView.tag = 1
        UIApplication.shared.windows.first?.addSubview(statusBarView)
    }

viewDidLayoutSubviews 多次收到调用并且您将 setupStatusBarView() 放入 viewDidLayoutSubviews 这意味着您的背景视图已添加多次,这是完全错误的流程!

您正在删除最顶层的视图,而不是之前的视图!

您应该在 viewDidLayoutSubviews 中设置 frame 并且应该添加来自 viewDidLoad 的视图!

试试这个

let subviewArray = UIApplication.shared.windows.first?.subviews
     for view in subviewArray!{
      if view.tag == 1{
         view.removeFromSuperview()
      }
   }