【问题标题】:How do I hide my Searchbar when scrolling?滚动时如何隐藏搜索栏?
【发布时间】:2020-04-11 18:57:59
【问题描述】:

我的 SearchController 在我的滚动内容顶部显示半透明的意外行为:

理想情况下,我希望它随着我的内容向上滚动并且导航栏折叠。

关于如何实现这一点的任何提示?

我正在 ViewDidLoad 中创建我的 SearchController,如下所示:

    let searchResultsController = SearchViewController(nibName: "SearchViewController", bundle: nil)
    let searchController = UISearchController(searchResultsController: searchResultsController)

    searchController.searchResultsUpdater = searchResultsController
    searchController.searchBar.autocapitalizationType = .sentences

    searchController.obscuresBackgroundDuringPresentation = true

    searchController.searchBar.placeholder = "Search Birds"

    searchController.searchBar.delegate = self 

    navigationItem.searchController = searchController

    definesPresentationContext = true

在 ViewWillAppear 中,我设置了 NavigationController:

    self.navigationController!.setNavigationBarHidden(false, animated: true)

我在 AppDelegate 中创建了我的导航控制器,例如: 公共 func applicationDidFinishLaunching(_ application: UIApplication) { // 实例化初始控制器 让 initialViewController = HomeViewController(nibName: "HomeViewController", bundle: nil)

    let navigationController = UINavigationController(rootViewController: initialViewController)

【问题讨论】:

    标签: ios swift uinavigationcontroller uisearchcontroller uinavigationitem


    【解决方案1】:

    你可以试试(如果你的 App 运行在 iOS 11.0 及以上)

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

    苹果文档:

    如果此属性为 true(默认),则 searchController 的搜索 当用户在顶视图控制器的滚动中滚动时,栏将隐藏 看法。如果为 false,搜索栏将保持可见并固定 在导航栏下方。

    【讨论】:

    • 我不明白的是默认行为应该是真的,所以默认情况下“正确”的行为应该是活跃的。
    • @Stephan 您可以尝试在创建搜索控制器时添加 navigationItem.hidesSearchBarWhenScrolling = true 吗?
    • 我添加了它,但没有。没有变化。
    • 查看我更新后的问题,了解如何创建导航控制器。会不会跟这个有关?
    【解决方案2】:

    您可以尝试以下方法:

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

    【讨论】:

    • 没什么区别。
    • 应该可以,但是不行。你知道我能找到什么吗?
    • 您可以尝试在viewDidLoad 中添加navigationItem.hidesSearchBarWhenScrolling = false 吗?
    • 我做了,但没有用。
    【解决方案3】:
    navigationItem.hidesSearchBarWhenScrolling = true
    

    【讨论】:

    • 请在您的答案中添加一些解释,以帮助将来有类似问题的其他人。
    【解决方案4】:

    让你的控制器确认 UIScrollViewDelegate 并覆盖这些方法:

    extension ViewController: UIScrollViewDelegate{
    
        func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
            self.navigationController!.setNavigationBarHidden(true, animated: true)
        }
    
        func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
            self.navigationController!.setNavigationBarHidden(false, animated: true)
        }
    }
    

    这可能需要根据您在应用中寻找的美感进行一些更改。

    【讨论】:

    • 这绝对不是我想要的。内置功能应该足够了。
    猜你喜欢
    • 2018-05-16
    • 2022-01-08
    • 2019-12-01
    • 2021-03-12
    • 2016-10-31
    • 2019-11-06
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    相关资源
    最近更新 更多