Ios 如何隐藏滚动条上的搜索栏?(不带UITableViewController)

Ios 如何隐藏滚动条上的搜索栏?(不带UITableViewController),ios,swift,uitableview,uinavigationbar,uisearchbar,Ios,Swift,Uitableview,Uinavigationbar,Uisearchbar,我有一个简单的UIViewController,其中包含一个UITableView,我想在滚动UITableView时将搜索栏隐藏在导航栏的内部。我发现 navigationItem.HideseArchBarWhenScrolling=true 但它不起作用。有什么方法可以让它在UIViewController上工作吗?我的猜测是,当您第一次进入UIViewController时,UISearchBar默认是隐藏的,考虑到您正在使用UISearchController并使用搜索图标或其他东西

我有一个简单的UIViewController,其中包含一个UITableView,我想在滚动UITableView时将搜索栏隐藏在导航栏的内部。我发现

navigationItem.HideseArchBarWhenScrolling=true

但它不起作用。有什么方法可以让它在UIViewController上工作吗?

我的猜测是,当您第一次进入
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 
}

请尝试这种方法

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
      }
}
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
}
然后在类中添加此函数

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只会创建另一个搜索栏。只是不要从情节提要中添加搜索栏,或从搜索栏中删除第一行。