Swift autohide/show tableview 顶部的搜索栏

Swift autohide/show searchbar on top of tableview

我已经成功实现了一个搜索栏,现在我想在向下滑动 tableview 时显示搜索栏,再次向下滑动时隐藏搜索栏。我应该使用什么方法?谢谢

A UITableViewUIScrollView 的子类,它具有委托方法(来自 UIScrollViewDelegate),您可以使用它们来确定滚动何时开始和结束。

您可以使用 scrollViewDidScroll(_:) 方法在用户开始滚动时收到通知,并在滚动结束时使用 scrollViewDidEndDecelerating(_:) 方法收到通知。

从你的问题来看,我假设你已经有了 show/hide 搜索栏的方法;您只是在寻找 "when" 来调用您的 showSearchBarhideSearchBar 方法。

你可以有一个 Bool 属性 来存储 searchBar 是否被隐藏,并相应地调用你的方法。

let searchBarIsHidden = true

override func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
   if searchBarIsHidden {
       showSearchBar() //your show search bar function
   } else {
       hideSearchBar() //your hide search bar function
   }
}

现在您应该确保在 showSearchBarhideSearchBar

末尾更新 searchBarIsHidden 的值

在 Swift 中使用搜索栏的顶部约束进行漂亮的隐藏和显示:

var lastContentOffset:CGFloat = 0 

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let bottomOffset = scrollView.contentSize.height - scrollView.bounds.height

    guard scrollView.contentOffset.y < bottomOffset  else {
        return
    }

    guard scrollView.contentOffset.y > 0 else {
        searchBarTopConstraint.constant = 0
        return
    }

    let offsetDiff = scrollView.contentOffset.y - lastContentOffset

    let unsafeNewConstant = searchBarTopConstraint.constant + (offsetDiff > 0 ? -abs(offsetDiff) : abs(offsetDiff))
    let minConstant:CGFloat = -searchBar.frame.height
    let maxConstant:CGFloat = 0

    searchBarTopConstraint.constant = max(minConstant, min(maxConstant, unsafeNewConstant))

    lastContentOffset = scrollView.contentOffset.y
}