UISearchController 不能与非半透明 UINavigationBar 一起正常工作

Posted

技术标签:

【中文标题】UISearchController 不能与非半透明 UINavigationBar 一起正常工作【英文标题】:UISearchController doesn't work properly with a non-translucent UINavigationBar 【发布时间】:2014-10-14 19:56:10 【问题描述】:

目前我正在尝试将 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行。

【问题讨论】:

是的,我也看到了。非常令人沮丧。 截图不存在。你能再上传一次吗? 【参考方案1】:

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

我的解决方法是设置

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

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

【讨论】:

edgesForExtendedLayout 调整对我来说不是必需的。但这行得通。 这对我也有用。在过去的两天里,我一直在努力解决这个问题。然而,它确实需要这两行。 目标vc上需要这两行? @Godfather 不,在展示的 VC 上。 为什么是苹果为什么!你用这个偷走了我三个小时的生命,我想要他们回来!【参考方案2】:

我只需要:

func viewDidLoad()  

    extendedLayoutIncludesOpaqueBars = true

【讨论】:

【参考方案3】:

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

您可以通过将视图控制器注册为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

【讨论】:

这对我有用。为什么 Apple 甚至支持更改导航栏上的 barTintColor? 头疼了几天。谢谢你,救了我的命。推送新视图控制器时需要将其设置回 false 并在 viewDidAppear 上将其设置为 searchController.isActive。【参考方案4】:

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

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

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

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

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

【讨论】:

【参考方案5】:

如果有人遇到像非半透明隐藏搜索栏这样的问题,你可以这样:

self.definesPresentationContext = true

问候

【讨论】:

以上是关于UISearchController 不能与非半透明 UINavigationBar 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Android 半透明状态栏但非半透明导航栏(如果存在)

HTML 各种非半字节和非标准HTML / XML DTD

UISearchController 搜索栏与 CollectionView 重叠

网页制作中,我使用滤镜,把背景颜色黑色半透明了,但它也把我黑色背景上的字体也给半透明了,求高手指...

UISearchController - 键盘不显示

unity部分模型半透明了怎么办