UISearchController无法与非半透明的UINavigationBar一起正常工作

sel*_*nan 24 cocoa-touch uinavigationbar uikit ios uisearchcontroller

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

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

但是如果UINavigationBar的"半透明"属性设置为"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
Run Code Online (Sandbox Code Playgroud)

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

https://www.dropbox.com/s/7icfe6kap98g1e8/TableSearchwithUISearchControllerObj-CandSwift_MODIFIED.zip?dl=0
Run Code Online (Sandbox Code Playgroud)

修改在文件"APLMainTableViewController.m"第33行.

Ort*_*ntz 25

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

我的解决方法是设置

self.edgesForExtendedLayout = UIRectEdgeAll;
self.extendedLayoutIncludesOpaqueBars = YES;
Run Code Online (Sandbox Code Playgroud)

这允许您保持导航栏不透明.缺点是即使无法看到内容,内容也会低于标准,从而产生一些开销.

  • 我不需要`edgesForExtendedLayout`调整.但这很有效. (6认同)

Jiř*_*lka 11

我只需要:

func viewDidLoad() { 

    extendedLayoutIncludesOpaqueBars = true
}
Run Code Online (Sandbox Code Playgroud)


Lui*_*uis 6

一种解决方法是在搜索变为活动状态之前使状态栏保持半透明状态,并在搜索变为非活动状态时删除半透明效果.

您可以通过将视图控制器注册为代理UISearchController并实现willPresentSearchControllerwillDismissSearchController方法来完成此操作.例如(in Swift):

将视图控制器声明为以下代理UISearchController:

 class MyViewController: UITableViewController, UISearchControllerDelegate
Run Code Online (Sandbox Code Playgroud)

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

    searchController.delegate = self
Run Code Online (Sandbox Code Playgroud)

最后:

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

func willDismissSearchController(searchController: UISearchController) {
    navigationController?.navigationBar.translucent = false
}
Run Code Online (Sandbox Code Playgroud)