导航栏中的灰色背景,在推送期间将 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
我在导航控制器中有一个 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