【问题标题】:Trigger redraw navigation bar appearance when scroll view is removed from superview从父视图中删除滚动视图时触发重绘导航栏外观
【发布时间】:2021-09-26 04:25:52
【问题描述】:

默认情况下,在 iOS 15 中,导航栏在滚动到顶部时是透明的,然后在向下滚动时显示其背景。如果它可以在视图层次结构中找到滚动视图,则此方法有效。

在我的应用程序中,用户可以向下滚动导致导航栏背景可见,然后他们可以执行最终导致滚动视图从视图层次结构中删除的操作。问题是导航栏没有更新为再次透明。

当滚动视图从屏幕上移除时,如何触发导航栏重绘?我试过了

navigationController?.navigationBar.scrollEdgeAppearance = nil
navigationController?.navigationBar.setNeedsDisplay()
navigationController?.navigationBar.setNeedsLayout()
navigationController?.navigationBar.layoutIfNeeded()

但不幸的是,这并没有奏效——背景仍然可见。

【问题讨论】:

    标签: ios uinavigationbar ios15


    【解决方案1】:

    我在 Twitter 上偶然发现了一个解决方案!感谢tweeting大卫邓肯。

    当滚动视图从视图层次结构中移除时,把它放在你的视图控制器中:

    //update navigation bar appearance now that the scroll view is gone
    setContentScrollView(UIScrollView(), for: .top)
    setContentScrollView(nil, for: .top)
    

    更新:这在 iOS 15.0 beta 5 中有效,但此后一直无效,测试到 15.2。我提交了错误报告。

    另一种解决方案是获取内容滚动视图并将其滚动到顶部,然后再将其从视图层次结构中移除:

    if let scrollView = contentScrollView(for: .top) {
        scrollView.setContentOffset(CGPoint(x: 0, y: -scrollView.contentInset.top), animated: false)
    }
    

    【讨论】:

      【解决方案2】:

      看来这段代码有效:

      navigationController.map { nvc in
          nvc.navigationBar.isTranslucent.toogle()
          nvc.navigationBar.isTranslucent.toogle()
      }
      

      【讨论】:

      • 这对我不起作用:(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      相关资源
      最近更新 更多