IOS:UISearchBar部分覆盖UINavigationBar并提示

时间:2017-10-13 15:01:33

标签: ios uinavigationbar uisearchbar prompt swift4

我正在使用带有UISearchBar的UITableViewController。 UITableViewController嵌入在UINavigationController中。显示表格视图时,搜索栏按预期位于顶部(在导航栏下方)。导航栏显示标题和提示。

当我点击搜索栏时,它会向上移动并隐藏导航栏中的标题。提示仍然可见。 当我不使用提示时,搜索栏在我点击它之后仍然按照预期位于导航栏下方。

我创建了一个非常简单的项目来演示我的问题。该项目具有UITableViewController的以下文件:

import UIKit

class searchTVC: UITableViewController, UISearchControllerDelegate, UISearchResultsUpdating {
    fileprivate let searchController = UISearchController(searchResultsController: nil)

    override func viewDidLoad() {
        super.viewDidLoad()

        title = "Title"
        navigationItem.prompt = "prompt"

        tableView.backgroundColor = UIColor.gray

        // Add search bar
        searchController.delegate = self
        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.dimsBackgroundDuringPresentation = false
        searchController.searchBar.sizeToFit()

        tableView.tableHeaderView = searchController.searchBar

        // remove separators for empty table
        tableView.tableFooterView = UIView()
    }

    func updateSearchResults(for searchController: UISearchController) {
        // ignore
    }
}

在故事板中,只有一个嵌入在UINavigationController中的空UITableViewController。结果如下所示。

如果您注释掉设置提示的行,则行为符合预期。

我最近将我的代码更新为Swift 4.我不记得我在使用Swift 3时看到过这种行为,但我并不完全确定它是在Swift 4中引入的。

我是否遗漏了代码中的内容,或者这是一个错误?

1 个答案:

答案 0 :(得分:2)

viewDidLoad

中设置这些内容
self.definesPresentationContext = true
self.edgesForExtendedLayout = .bottom