如何使用 UISearchController *从 UINavigationBar 中删除 1px 底部边框?

How to remove 1px bottom border from UINavigationBar *with* a UISearchController?

我有一个包含 UISearchController 的导航栏,但我找不到摆脱导航栏下方 1px 底部边框的方法:

我已经按照 this answer 和许多其他人的建议使用了删除导航栏底部边框的技巧:

navigationBar.isTranslucent = false
navigationBar.setBackgroundImage(aTransparentImage, for: .default)
navigationBar.shadowImage = nil

如果我不在我的视图控制器的 navigationItem 上设置 searchController 没问题,没有底部边框,但是一旦我设置了 searchController 它出现。

即使是在导航栏视图层次结构中寻找 1px UIImageView 的肮脏技巧也不起作用,因为该视图似乎位于层次结构的单独树中。这是下面用蓝色突出显示的 UIImageView

我没主意了

好的,我的一个同事提供了一个解决方案。在显示搜索栏的视图控制器中的 viewWillAppear 中执行:

if let imageView = navigationItem.searchController?
    .searchBar.superview?
    .subviews.first?
    .subviews.last as? UIImageView,
    imageView.frame.height * UIScreen.main.scale == 1.0 {
    imageView.isHidden = true
}

这显然高度依赖于 UIKit 用于搜索栏的确切视图层次结构,并且可能会停止与 iOS 的任何未来版本一起工作(它适用于 iOS 12)。您可以通过在 superview 子视图中搜索 1px 高度来使其更具弹性 UIImageView,但是,这仍然是一个 hack。

但到目前为止,这是我发现的唯一可行的解​​决方案。

尝试添加

self.extendedLayoutIncludesOpaqueBars = true

self.automaticallyAdjustsScrollViewInsets = false;
self.extendedLayoutIncludesOpaqueBars = true

在 ViewDidLoad 方法中。它对我有用