2

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

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

由于从屏幕上删除滚动视图,如何触发重新绘制导航栏?我试过了

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

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

4

2 回答 2

1

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

当从视图层次结构中删除滚动视图时,将其放入视图控制器中:

//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)
}
于 2021-08-17T02:41:10.687 回答
0

看来这段代码有效:

navigationController.map { nvc in
    nvc.navigationBar.isTranslucent.toogle()
    nvc.navigationBar.isTranslucent.toogle()
}
于 2021-11-23T11:28:43.520 回答