2015-12-02 41 views

回答

4

一个UITableView是具有委托(从UIScrollViewDelegate)方法UIScrollView一个子类,你可以用它来找出何时滚动已经开始和结束。

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

从你的问题,我假设你已经有一个方法来显示/隐藏搜索栏;你只是在寻找“何时”来拨打你的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

+0

谢谢您。它像一个魅力! :) – Igy

1

美丽隐藏月底更新的searchBarIsHidden价值,并显示了使用搜索栏的顶部约束斯威夫特:

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 
}