【问题标题】:How to hide search bar on scroll? (without UITableViewController)如何在滚动条上隐藏搜索栏? (没有 UITableViewController)
【发布时间】:2019-11-06 21:17:36
【问题描述】:

我有一个包含 UITableView 的简单 UIViewController,我想在滚动 UITableView 时将搜索栏隐藏在导航栏内。我找到了

navigationItem.hidesSearchBarWhenScrolling = true

但它不起作用。有没有办法让它在 UIViewController 上工作?

【问题讨论】:

  • 滚动方向是什么?
  • 你在哪里添加的
  • 发生了什么问题解决了吗?

标签: ios swift uitableview uinavigationbar uisearchbar


【解决方案1】:

SWIFT 4 简单实现

UISearchBarDelegate 代表添加到您的班级

然后在你的类中添加这个函数

func showSearchBar() {
    let searchController = UISearchController(searchResultsController: nil)
    searchController.searchBar.delegate = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.hidesNavigationBarDuringPresentation = true
    navigationItem.hidesSearchBarWhenScrolling = true 
    //true for hiding, false for keep showing while scrolling
    searchController.searchBar.sizeToFit()
    searchController.searchBar.returnKeyType = UIReturnKeyType.search
    searchController.searchBar.placeholder = "Search here"
    navigationItem.searchController = searchController
}

然后在你的viewDidLoad()中调用函数

【讨论】:

  • 我喜欢它的工作原理。但是将它添加到我的 SearchBarDelegate 只会创建另一个搜索栏。
  • 只是不要从情节提要中添加搜索栏,或者从搜索栏中删除第一行。
【解决方案2】:

我的猜测是当你第一次输入UIViewController 时,UISearchBar 默认是隐藏的,考虑到你正在使用UISearchController 并使用搜索图标或其他东西访问它。

对于这种情况,iOS 默认情况下不会隐藏UISearchBar 并且(隐藏/显示)基于您在UITableView 中的滚动方向现在如何解决这个问题。

由于我们无法取消此行为,但是当用户磁带取消时我们可以做一些稍微好一点的工作,我们将 UISearchController 设置为 nil 以将其从 UIViewController 中删除,当用户点击搜索图标,我们再次给它一个值并显示它。

注意:这个答案假设您以这种方式实现它,考虑到问题中没有太多上下文或代码。

让我们进入代码。

 func prepareSearchController() { //function to setup the SearchBar  
    // Setup the Search Controller
    searchController.searchResultsUpdater = self
    searchController.searchBar.delegate = self
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search Items"
    navigationItem.searchController = searchController
    definesPresentationContext = true
}

   @objc func openSearch() { // when user tap on the search icon 
    prepareSearchController()
    self.navigationItem.searchController?.isActive = true
}

现在我们符合UISearchBarDelegate 来访问取消按钮操作。

 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { // this function is available only in search bar delegate  make sure to conform to it . 
    self.navigationItem.searchController = nil 
}

【讨论】:

    【解决方案3】:

    请试试这个方法

    override func viewWillAppear(_ animated: Bool) {
            if #available(iOS 11.0, *) {
                  navigationItem.hidesSearchBarWhenScrolling = false
           }
    }
    
    override func viewDidAppear(_ animated: Bool) {
            if #available(iOS 11.0, *) {
                  navigationItem.hidesSearchBarWhenScrolling = true
          }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-11
      • 2019-06-22
      • 2021-02-06
      • 2021-03-12
      • 2019-12-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多