在表格视图中搜索栏为 header - 出现和消失

Search bar as header in tableview - appear and disappear

我需要在 table 视图的顶部放置一个搜索栏。我正在进行网络调用,当结果大于 100 时,我希望搜索栏出现,当结果小于 100 时,我不想搜索栏出现。 table视图位于VC的右侧,并没有占据整个视图控制器。我希望搜索栏作为 header 位于 table 视图的顶部。

我不能使用搜索控制器,因为在 iOS 11 中,使用搜索控制器会使搜索栏在 VC 处于活动状态时弹出到顶部。

我试图将 tableviewheader 设置为 nil 以使其消失。但是我显然无法取回它,因为我将 header 设置为零。

self.rightDetailFilterTableView.tableHeaderView = nil
self.rightDetailFilterTableView.sectionHeaderHeight = 0

我已将搜索栏放入情节提要中,如下图所示。这是将搜索栏添加为 header 的正确方法吗?

让它在 table 视图中出现和消失的最佳方法是什么?我尝试了很多不同的方法。他们要么留空header,要么做其他导致问题的事情。我也尝试使用 header 委托方法,但仍然无效。

我没有使用 table 视图控制器,我使用的是普通的 VC。我也没有使用搜索栏控制器,因为它会导致 iOS 11.

这是我在最近的一个项目中所做的。首先,阐述一下我的观点:

也就是说,搜索栏被添加到父视图而不是 table 视图。这允许我根据需要 hide/show 它。

接下来,我定义了两个可选的布局约束,一个确保 tableview 与安全区域的顶部对齐,优先级 750;另一个将搜索栏的顶部与安全区域的顶部对齐;低于 750 的优先级将其隐藏在导航栏下方或高于 750 的优先级将其显示并将 table 视图向下推。

在代码中,我为安全区域顶部的搜索栏的布局约束创建了一个@IBOutlet,并根据需要更改其优先级:

@IBAction
func toggleSearchBar(_ sender: Any?) {
    if searchBarVisibleLayoutConstraint.priority.rawValue > 750.0 {
        searchBarVisibleLayoutConstraint.priority = UILayoutPriority(rawValue: 1.0)
        searchBar?.endEditing(true)
    } else {
        searchBarVisibleLayoutConstraint.priority = UILayoutPriority(rawValue: 999.0)
    }
    UIView.animate(withDuration: 0.3) {
        self.view.layoutIfNeeded()
    }
}

在我的例子中,导航栏是不透明的,搜索栏在它后面不可见。您的情况可能有所不同,因此您可能还想剪裁父视图或在搜索栏不可见时对其进行 alpha 淡入淡出。

祝你好运!

请检查:

为我的 SearchBar 创建了 IBOutlet。

@IBOutlet weak var testbar: UISearchBar!

在我的 viewDidLoad 中:

override func viewDidLoad() {
    var contentOffset = tableView.contentOffset
    let showSearchBar = (results.count > 100)
    self.tableView.tableHeaderView?.isHidden = !(showSearchBar)
    if showSearchBar {
        contentOffset.y -= testbar.frame.size.height
    } else {
        contentOffset.y += testbar.frame.size.height
    }
    tableView.contentOffset = contentOffset
}

这是我的 tableview 故事板