我的 UISearchBar
是导航栏的一部分,如:
let searchBar = UISearchBar()
//some more configuration to the search bar
.....
navigationItem.titleView = searchBar
更新到 iOS 11
后,我的应用中的搜索栏发生了一些奇怪的事情 . 在 iOS 10
之前我的导航栏看起来像:
现在 iOS 11
我有:
正如你所看到的那样,两个搜索栏的舍入存在差异,这并不困扰我 . 问题是搜索栏会增加导航栏的高度 . 所以,当我去另一个控制器时,它看起来很奇怪:
事实上,奇怪的黑线的高度加上当前导航栏的高度等于第二张图片中显示的导航栏的高度...
任何想法如何摆脱黑线和所有视图控制器具有一致的导航栏高度?
17 回答
您可以将高度为44的约束添加到iOS 11的搜索栏中 .
// Objective-c
我相信在iOS 11中,UISearchBar现在的高度等于56,而UINavigationBar使用autolayout来适应其子视图,因此它增加了高度 . 如果您仍然希望UISearchBar与iOS 11之前的titleView一样,我发现最好的方法是在自定义视图中嵌入UISearchBar,并将此视图的高度设置为44,并将其分配给navigationItem.titleView
在两种情况下,我在iOS5的NavigationBar下使用SearchBar获得黑线:
当我使用UISearchBar从ViewController推送ViewControllers时
当我用"drag right to dismiss"
解雇带有UISearchBar的ViewController时
我的解决方案是:使用UISearchBar将此代码添加到我的ViewController:
Swift 4 Update
在viewDidLoad中的“ACKNOWLEDGMENTS”视图控制器上尝试此代码
In Objective-C
我无法使用将navBar保持在44的解决方案 . 所以我花了一天时间,但最后,我找到了一个解决方案,它不会改变条形高度并将按钮放在条形图中间 . 问题是按钮放置在堆栈视图中,该视图配置为水平堆栈视图,因此不会调整高度更改 .
这是在init上完成的:
在viewWillApear上(或在视图添加到导航堆栈后的任何时间)
subviewOfClass是UIView上的一个类别:
谢谢你们!我终于找到了解决方案 .
使用UISearchBar将以下代码添加到ViewController .
viewDidLoad
viewWillDisappear
就我而言,更大的UINavigationBar的高度对我来说不是问题 . 我只需要重新调整左右栏按钮项目 . 这就是我提出的解决方案:
基本上,我们搜索包含条形按钮项的堆栈视图,然后更改它们的顶部和底部约束值 . 是的,这是一个肮脏的黑客,如果你能以任何其他方式修复你的问题,不建议使用它 .
编辑:@zgjie答案是解决此问题的更好解决方案:https://stackoverflow.com/a/46356265/1713123
这似乎发生了这种情况,因为在iOS 11中,SearchBar的默认高度值已更改为56,而在以前的iOS版本中为44 .
目前,我已应用此解决方法,将searchBar高度设置回44:
另一个解决方案可能是使用new searchController property on navigationItem in iOS 11:
但这种方式da searchBar出现在导航 Headers 下方 .
我尝试了各种各样的东西来使尺寸恢复到原来的44,但随后搜索栏总是看起来和表现得很奇怪 - 比如被拉伸,y偏移和相似 .
我在这里找到了一个很好的解决方案(通过其他一些stackoverflow帖子):https://github.com/DreamTravelingLight/searchBarDemo
只需从SearchViewController派生您的viewcontroller,并在您的项目中包含SearchViewController和WMSearchbar类 . 我没有任何丑陋的工作开箱即用(iOS11)其他......丑陋 .
所有解决方案都不适合我,所以在我推动视图控制器之前我做了:
并且在返回时使搜索栏出现:
我发现Mai Mai 's solution to be the only one that'真的很实用 .
然而,它仍然不完美:
旋转设备时,搜索栏未正确调整大小并保持较小的尺寸 .
我找到了解决方法 . 这是我在Objective C中的代码,其中注释了相关部分:
现在还有一个案例,我还没想到 . 重现做以下:
嗨,使用
UISearchController
,然后将UISearchBar
附加到navigationItem.titleView
的人 . 我花了一个疯狂的4-5个小时来解决这个问题 . 遵循iOS 11推荐的方法,将searchController
放到navigation.searchController
并不适合我的情况 . 具有此searchController / searchBar的屏幕具有backButton,一个自定义的 .我已经在iOS 10,iOS 11和12中对此进行了测试 . 在不同的设备中 . 我只是必须 . 没有解决这个恶魔,我不能回家 . 鉴于截止日期紧迫,这是我今天能做的最完美的事情 .
所以我只想分享我所做的这项艰苦的工作,由你决定将所有内容放在你想要的地方(例如你的viewModel中的变量) . 在这里:
在我的第一个屏幕(比如主屏幕,没有这个搜索控制器),我在
viewDidLoad()
中有这个 .在我的第二个屏幕中,有一个具有searchController的屏幕,我在_1580463中有这个 .
override func viewDidAppear(_ animated:Bool){super.viewDidAppear(animated)
这是我的searchController的声明:
所以我希望有一天能帮助某人 .
在我的情况下,我必须减少textField的高度36pt - > 28pt .
所以我试着改变框架的高度,图层的高度 . 但方法没有奏效 .
最后,我发现了一个解决方案就是面具 . 我想,这不是一个好方法,但它有效 .
如果要更改textField的框架,可以更改insets .
我通过在嵌入搜索栏的 Map 视图控制器上添加约束到viewDidAppear来修复此问题
您所要做的就是子类化UISearchBar并覆盖“intrinsicContentSize”: