【问题标题】:iOS 13 remove UIView for simulate status bar backgroundiOS 13 移除 UIView 以模拟状态栏背景
【发布时间】:2020-05-15 21:19:15
【问题描述】:

我正在使用UITableViewController,它在滚动时会使导航栏消失。现在,当用户滑动表格视图时隐藏导航栏时,可以在状态栏下方看到单元格的内容...

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

现在我的代码是这样的,你能帮我理解我错在哪里吗?为什么我不能从 superview 中删除 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)
    }

【问题讨论】:

  • 它对我来说工作正常
  • 在添加StatusBarView之前,请检查状态栏视图是否已经存在...可能您添加了两次...删除了一次

标签: ios swift uitableview uiview statusbar


【解决方案1】:

viewDidLayoutSubviews 多次接听电话,而您已将setupStatusBarView() 放入viewDidLayoutSubviews,这意味着您的背景视图已被多次添加,这是完全错误的流程!

您只删除最顶层的视图,而不是以前的视图!

您应该在viewDidLayoutSubviews 中设置frame,并且应该从viewDidLoad 添加视图!

【讨论】:

  • 在 viewDidLoad 中不起作用...当我将 Frame 放入 viewDidLayoutSubviews 并在 viewWillAppear 中添加视图时工作...但是您的答案是正确的...谢谢
【解决方案2】:

试试这个

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

【讨论】:

  • 更合适的解决方案是在“添加”而不是“删除”所有副本时评估子视图。他们说,预防胜于治疗:)
  • 是的,不建议添加许多相似的子视图!
猜你喜欢
  • 2020-01-26
  • 2014-12-15
  • 1970-01-01
  • 2020-01-29
  • 2019-06-18
  • 2015-06-01
  • 1970-01-01
  • 2014-01-14
  • 2018-04-10
相关资源
最近更新 更多