如何在Swift中以编程方式显示/隐藏UISearchBar

5

我希望能够编写代码程序控制显示/隐藏UISearchBar,但是我没有得到期望的结果。

我的目标是:当向下滚动时隐藏搜索栏,向上滚动时再显示出来。

我将UISearchBar设置为以下内容:

var mySearchcontroller = UISearchController(searchResultsController: nil)
mySearchcontroller.obscuresBackgroundDuringPresentation = false
mySearchcontroller.searchBar.placeholder = "search"
mySearchcontroller.searchBar.delegate = self
definesPresentationContext = true
self.navigationItem.searchController = mySearchcontroller
self.navigationItem.hidesBackButton = true
self.navigationItem.hidesSearchBarWhenScrolling = false

结果如下:

enter image description here

我实现了scrollViewDidScroll方法,使搜索栏在滚动时显示或隐藏:

  func scrollViewDidScroll(_ scrollView: UIScrollView) {
if(scrollView.panGestureRecognizer.translation(in: scrollView.superview).y > 0)
{

    navigationItem.hidesSearchBarWhenScrolling = false
    }
else
{
 navigationItem.hidesSearchBarWhenScrolling = true
}
}

结果如下:

enter image description here

你可能已经注意到GRP标签或分段控件被搜索栏遮盖了,而且搜索栏没有像图1一样能够将所有控件向下推。

我该怎么解决这个问题呢?

1个回答

1
你可以按照以下步骤实现此功能:
1. 为你的视图设置适当的自动布局。 2. 设置你的headerview/searchview高度的IBOutlet,例如:
@IBOutlet weak var constrainHeightHeader: NSLayoutConstraint!

编写类似以下的scrollview委托方法:

 //MARK: - Scrollview delegate
  func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
   //
   self.contentOffSet = self.cwProducts.contentOffset.y
 }

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
   //

   let scrollPos = self.cwProducts.contentOffset.y
   if scrollPos == self.contentOffSet{
       return
   }
   if(scrollPos > self.contentOffSet ){
       //Fully hide your toolbar
       self.constrainHeightHeader.constant = 0
       UIView.animate(withDuration: 0.2, animations: {
           self.view.layoutIfNeeded()
       }, completion: { (status) in
           self.headerVW.isHidden = true
       })
   } else {
       if(self.isFromBanner) {
           self.constrainHeightHeader.constant = 0
       }else{
           self.constrainHeightHeader.constant = 50
       }

       UIView.animate(withDuration: 0.2, animations: {
           self.view.layoutIfNeeded()
       }, completion: { (status) in
           self.headerVW.isHidden = false
       })
   }
  }

我希望你能理解我的意思,通过对上述代码进行微小的更改,你将得到解决方案。

在我的项目中测试,它百分百可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接