导航栏中的灰色背景,在推送期间将 searchController 添加到 navigationItem

Grey background in navigation bar with searchController added to navigationItem during push

我在导航控制器中有一个 table 视图,这样我就可以将细节视图控制器推送到堆栈上。它工作正常,直到我将搜索控制器添加到导航项,如下所示:

searchController = UISearchController(searchResultsController: nil)
searchController.obscuresBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
searchController.searchBar.delegate = self
searchController.searchBar.tintColor = Colors.mlLabel
navigationItem.searchController = searchController
definesPresentationContext = true

它导致临时灰色背景,见下文:

在调试视图层次结构时,看起来 UIViewControllerWrapperView's _UIParallaxDimmingView(在下面选择)导致了这种情况,因为导航栏和状态栏都是透明的。

我该如何解决这个问题?

注意:pushViewController() 中的 animated 属性 设置为 false 有效,但我想保留动画。

更新: 这似乎只在 iOS 13 上出现问题。甚至可能来自一些最近的版本,因为我之前没有遇到这个问题。

更新 2: 我现在在我的应用程序的多个地方注意到了同样的问题,而且它不仅仅是与 SearchController 结合使用。基本上 _UIParallaxDimmingView 伸出了它的鼻子。

更新

这是我用来从大标题变成小标题的代码。这些是大标题 viewcontroller 或更具体的导航控制器的属性:

navigationController.navigationBar.prefersLargeTitles = true
navigationController.topViewController?.extendedLayoutIncludesOpaqueBars = true

也许上面的第二行对你有帮助?

至于推送任何视图控制器,我发现我已经覆盖了导航控制器中的 push-function(因为我对标签栏中的每个选项卡都使用了导航控制器):

override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    if viewControllers.count >= 1 {
        viewController.hidesBottomBarWhenPushed = true
        viewController.navigationItem.largeTitleDisplayMode = .never
    }
    super.pushViewController(viewController, animated: animated)
}

上一个回答

我以前见过几次,它总是需要对视图控制器本身的背景颜色进行处理。如果它是透明的,你会在动画时看到这些东西。

但由于它是一个搜索控制器,它可能是导航栏。无论如何,由于问题只是从 iOS13 开始,我相信可以使用以下方法解决问题:

searchController.searchBar.backgroundColor = UIColor.clear (or whatever color)

这个新的 属性 (UISearchBar.searchTextField.backgroundColor) 是自 iOS13 以来添加的,所以也许这会为您解决这个问题? :)

我终于找到了解决办法。问题之一是我为导航栏设置了背景颜色,如下所示:

UINavigationBar.appearance().backgroundColor = .white

因此删除上面的行并将下面的行添加到视图控制器被推送修复它。

extendedLayoutIncludesOpaqueBars = true