【问题标题】:How to show / hide UISearchBar programmatically in Swift如何在 Swift 中以编程方式显示/隐藏 UISearchBar
【发布时间】:2020-01-11 20:24:56
【问题描述】:

我想以编程方式显示/隐藏 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

结果是

我实现了 scrollViewDidScroll 让搜索栏在滚动时显示或隐藏:

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

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

结果是:

当您意识到 GRP 标签或分段控件被搜索栏掩盖时,我没有在搜索栏下推所有控件时产生相同的效果(图 1)。

我该如何解决这个问题?

【问题讨论】:

    标签: ios swift uisearchbar uisearchcontroller


    【解决方案1】:

    您可以通过以下步骤实现此功能:

    为您的视图提供适当的自动布局。

    将 IBOutlet 设置为 headerview/sea​​rchview 的高度,例如:

    @IBOutlet weak var constrainHeightHeader: NSLayoutConstraint!
    

    编写滚动视图委托方法,如:

     //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
           })
       }
      }
    

    我希望你明白我的意思,通过对上述代码的微小改动,你会得到解决方案。

    它在我的项目中工作 100% 测试。

    【讨论】:

      猜你喜欢
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 2014-12-29
      相关资源
      最近更新 更多