24

目前我正在尝试将 UISearchController 嵌入到我的应用程序中。但是,如果 UINavigationBar 是非半透明的,作为 UISearchController 的属性的 UISearchBar 将无法正确显示。通常在点击 UISearchBar 属性后,UINavigationBar 会向上移动以为 UISearchBar 腾出空间。您可以在以下屏幕截图中看到结果:

https://www.dropbox.com/s/172k63zr2bhj84t/Normal_behaviour.png?dl=0

但是如果 UINavigationBar 的“translucent”属性设置为“NO”,则 UISearchBar 无法正确显示,因为状态栏的背景保持透明,如下图所示:

https://www.dropbox.com/s/v5cnxoj9ms6976r/Wrong_behaviour.png?dl=0

为了演示这种奇怪的行为,我修改了 Apple 提供的示例项目:

https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html

在这里您可以下载修改后的版本:

https://www.dropbox.com/s/7icfe6kap98g1e8/TableSearchwithUISearchControllerObj-CandSwift_MODIFIED.zip?dl=0

修改位于文件“APLMainTableViewController.m”第 33 行。

4

5 回答 5

28

这显然是一个错误(rdar://20942583)。

我的解决方法是设置

self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = YES;

这允许您保持导航栏不透明。缺点是即使看不到,内容也会在条形下方流动,从而产生一些开销。

于 2015-05-13T21:56:27.710 回答
12

我只需要:

func viewDidLoad() { 

    extendedLayoutIncludesOpaqueBars = true
}
于 2015-07-07T15:39:24.193 回答
6

一种解决方法是在搜索即将变为活动状态之前使状态栏半透明,并在搜索即将变为非活动状态时移除半透明。

您可以通过将视图控制器注册为 的委托UISearchController并实现willPresentSearchControllerwillDismissSearchController方法来做到这一点。例如(在Swift):

将您的视图控制器声明为UISearchController

 class MyViewController: UITableViewController, UISearchControllerDelegate

不要忘记将其实际设置为委托,例如在viewDidLoad添加中:

    searchController.delegate = self

最后:

func willPresentSearchController(searchController: UISearchController) {
    navigationController?.navigationBar.translucent = true
}

func willDismissSearchController(searchController: UISearchController) {
    navigationController?.navigationBar.translucent = false
}
于 2015-04-29T13:55:50.690 回答
0

好的,这个调试起来非常痛苦,但修复起来还不错。这完全取决于 Apple 改变导航栏外观的方式。它可以通过创建一个UINavigationBarAppearance对象来修复,使用您想要的视觉属性(即背景颜色等)对其进行配置,然后将其分配给standardAppearancescrollEdgeAppearance继续UINavigationBar.appearance()- 如果您愿意,您可以拥有两个具有不同设置的不同实例。

一个简单的实现可能如下所示:

let appearance = UINavigationBarAppearance()
appearance.configureWithDefaultBackground()
appearance.backgroundColor = barColor
appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: textColor]

UINavigationBar.appearance().standardAppearance = appearance
UINavigationBar.appearance().scrollEdgeAppearance = appearance

(自然地将 barColor 和 textColor 替换为您选择的颜色!)

于 2020-12-09T10:28:52.570 回答
-1

如果有人遇到诸如不透明隐藏搜索栏之类的问题,您可以这样做:

self.definesPresentationContext = true

问候

于 2016-08-08T15:01:08.933 回答