Swift 如何最初在导航栏中显示搜索栏,但在用户向上滚动时仍将其隐藏?

Swift 如何最初在导航栏中显示搜索栏,但在用户向上滚动时仍将其隐藏?,swift,uinavigationbar,uisearchbar,Swift,Uinavigationbar,Uisearchbar,我正在构建一个基本的ViewController,其中包含一个具有多个部分的CollectionViewController。我希望导航栏中包含一个UISearchBar,但它似乎只允许两个行为选项:首先隐藏搜索栏,然后在用户向下滚动时显示,或者始终显示搜索栏 我希望搜索栏能够像在Messages应用程序中一样工作,用户不必滚动它就会出现,然后在用户向下滚动页面时隐藏。我相信有一个简单的解决方案,但我对iOS开发还相当陌生,还没有找到任何以前提出的问题 搜索栏始终存在时的外观示例: 用户必须向

我正在构建一个基本的ViewController,其中包含一个具有多个部分的CollectionViewController。我希望导航栏中包含一个UISearchBar,但它似乎只允许两个行为选项:首先隐藏搜索栏,然后在用户向下滚动时显示,或者始终显示搜索栏

我希望搜索栏能够像在Messages应用程序中一样工作,用户不必滚动它就会出现,然后在用户向下滚动页面时隐藏。我相信有一个简单的解决方案,但我对iOS开发还相当陌生,还没有找到任何以前提出的问题

搜索栏始终存在时的外观示例:

用户必须向下滚动才能显示搜索栏时的外观示例:

控制器和搜索栏的初始化:

let searchController=UISearchController(searchresultcontroller:nil)
让搜索栏:UISearchBar={
let search=UISearchBar()
search.placeholder=“搜索”
search.translatesAutoresizingMaskIntoConstraints=false
search.sizeToFit()
search.barStyle=.default
返回搜索
}()
//截断的。。。
//从viewDidLoad()调用
func配置搜索栏(){
searchController.SearchResultsUpdate=self
searchController.obscuresBackgroundDuringPresentation=false
searchController.searchBar.placeholder=“搜索”
searchController.searchBar.translatesAutoResizezingMaskintoConstraints=false
searchController.isActive=true
DefinePresentationContext=true
navigationItem.title=“测试标题”
navigationItem.searchController=searchController
navigationItem.HideseArchBarWhenScrolling=false
}

我知道这段代码不会产生预期的行为,但是有没有一个简单的修改可以让它正常工作?

我找到了一种最初显示UISearchbar的方法。在这一点上,我真的不确定这是苹果的意图,还是仅仅是为了让一个简单的行为起作用而进行的另一次黑客攻击

设置
UISearchController
后,在
viewdiload
中调用:

present(searchController, animated: true)
然后,这将设置动画并扩展导航栏,并显示搜索栏。在编辑完栏中的文本后,不要忘记再次关闭它。即使您最初隐藏了搜索栏,也需要这样做,因为如果不这样做,搜索栏将被保留,最终导致泄漏

编辑: 为了回答您的其余问题,我提供了一些演示代码来让大家了解这个想法:

您可以观察contentOffset并在其具有特定值时将其关闭:

observable = self.viewDictionary.tableView.observe(\.contentOffset) { [unowned self] value in
        guard let offset = value else { return }
        if offset.y > 30 {
            self.navigationItem.searchController?.dismiss(animated: true)
        }
    }

observer代码使用了一个简单的扩展名found&explained,但使用标准库版本也可以使用。

在viewDidLoad()中设置
HideseArchBarWhenScrolling=true

将滚动视图contentOffset设置为ViewWillAspect()中搜索栏高度的倒数


“Messages应用程序,用户无需滚动即可显示,”,当您刚刚启动Messages应用程序时,默认情况下不会显示搜索字段,仅当您在topWell向上滚动时才会显示,为什么不将自定义CollectionView的第一个单元格设为搜索栏,这样,每当collectionView加载时,搜索栏将始终显示在顶部,当您滚动时,它将隐藏,然后当您再次滚动到顶部时,它将可见。但这似乎不是导航栏的一部分
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    let offset = -(searchController.searchBar.frame.height)
    tableView.setContentOffset(CGPoint(x: 0, y: offset), animated: false)
}