呈现搜索结果控制器时 UISearchBar 的高度不正确

Posted

技术标签:

【中文标题】呈现搜索结果控制器时 UISearchBar 的高度不正确【英文标题】:UISearchBar's height is incorrect when presenting search result controller 【发布时间】:2017-12-27 07:09:00 【问题描述】:

我在tableView的标题视图中有一个搜索栏,我没有改变它的高度(默认是56pt)。当搜索栏处于活动状态并且其位置位于屏幕顶部时,它的高度变为 50pt。它会在 iPhone 或模拟器(ios 11 版本)上发生。

首次出现:

<UISearchBar: 0x7f94b6646900; frame = (0 0; 375 56); text = ''; gestureRecognizers = <NSArray: 0x60400025fc20>; layer = <CALayer: 0x604000225fe0>>

编辑:

<UISearchBar: 0x7f94b6646900; frame = (0 14; 375 50); text = ''; autoresize = W+TM; gestureRecognizers = <NSArray: 0x60400025fc20>; layer = <CALayer: 0x604000225fe0>>

这会导致搜索栏和结果控制器的视图之间出现奇怪的差距。

感谢您的任何想法。

编辑1: 这是我的代码:

fileprivate func configSearchBar() -> Void 
    let bar = self.searchBar
    var size = bar.frame.size

    let statusBarHeight = UIApplication.shared.statusBarFrame.size.height
    bar.setBackgroundImage(UIImage.imageWith(color: .white, size: size),
                           for: .any,
                           barMetrics: .default)
    let colorWhenEditing = UIColor.colorFromHexString("#FAFAFA")
    if UIDevice.isIPHONEX() 
        bar.barTintColor = colorWhenEditing
     else 
        bar.setBackgroundImage(UIImage.imageWith(color: colorWhenEditing, size: CGSize(width: size.width, height: size.height + statusBarHeight)),
                               for: .topAttached,
                               barMetrics: .default)
    
    size = CGSize(width: bar.frame.size.width - 30, height: 30)
    let image = UIImage.imageWith(color: UIColor(hexString: "#F0F0F0"), size: size)?.zoom(toSize: size, cornerRadius: 4)
    bar.setSearchFieldBackgroundImage(image, for: .normal)

    bar.searchTextPositionAdjustment = UIOffset(horizontal: 5, vertical: 0)


self.tableView.tableHeaderView = self.searchBar

Edit2: - 搜索控制器和搜索栏初始化:

// Main view controller
lazy var searchResultController: UISearchController = 
    let vc = MailSearchResultViewController(nibName: nil, bundle: nil)
    let sc = UISearchController(searchResultsController: vc)
    sc.searchResultsUpdater = self
    sc.modalPresentationCapturesStatusBarAppearance = true
    sc.delegate = self
    return sc
()
var searchBar: UISearchBar 
    return searchResultController.searchBar

// MailSearchResultViewController - viewDidLoad:
self.edgesForExtendedLayout = []
self.automaticallyAdjustsScrollViewInsets = false

【问题讨论】:

分享您的UISearchBar 代码。 你是如何将它作为标题视图添加到表格视图中的?你在代码里做过吗? @ImadAli 在Edit1中添加代码。 @AhmadF 见 Edit1 您会尝试this answer 而不是以编程方式进行吗? 【参考方案1】:

我认为问题在于自动调整 scrollView 插图。要解决此问题,请执行以下操作

    转到故事板。 选择包含搜索栏控制器的控制器 转到属性检查器 取消选中调整滚动视图插图

【讨论】:

我不使用故事板,我在搜索结果视图控制器和 UISearchController 中以编程方式将 automaticallyAdjustsScrollViewInsets 设置为 false,但这不起作用。【参考方案2】:

由于您正在使用 iOS 11,并且从 cmets 看来您有一个导航控制器,您应该考虑将搜索栏直接放在导航项中,而不是表视图标题,这仍然是您应该使用的方法iOS 10 及之前版本。您可以查看文档here。

似乎自从 Apple 引入了这种显示搜索栏的新方式后,UIKit 不再能够在 iOS 11 及更高版本的表格视图标题中正确显示它。您还可以查看this question(在 ObjC 中),其中相同的更改会引入您的相同问题或来自 Apple 的 this video。

【讨论】:

以上是关于呈现搜索结果控制器时 UISearchBar 的高度不正确的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C - 滚动时 UISearchController 结果在 UISearchBar 上重叠

UISearchBar 在活动时与 UITableView 内容重叠

UISearchBar 在取消时消失

iOS:带有 UISearchdisplaycontroller 的 UISearchBar 通过单击搜索栏崩溃

在 iOS 10 中以模态方式呈现新 VC 时崩溃

如何触发 UISearchBar 中的取消按钮?