如何在 SwiftUI 中滚动时隐藏 SearchBar?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中滚动时隐藏 SearchBar?【英文标题】:How to hide SearchBar on scroll in SwiftUI? 【发布时间】:2020-04-18 19:08:52 【问题描述】:

我正在尝试在我的应用中隐藏搜索栏,就像 Apple 在他们的消息应用中所做的那样:

我已经在 SwiftUI 中实现了 UISearchBar:

struct SearchBar: UIViewRepresentable 
@Binding var text: String

class Coordinator: NSObject, UISearchBarDelegate 
    @Binding var text: String

    init(text: Binding<String>) 
        _text = text
    

    func searchBar(_: UISearchBar, textDidChange searchText: String) 
        text = searchText
    


func makeCoordinator() -> SearchBar.Coordinator 
    return Coordinator(text: $text)


func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar 
    let searchBar = UISearchBar(frame: .zero)
    searchBar.delegate = context.coordinator
    searchBar.searchBarStyle = .minimal
    searchBar.placeholder = "Поиск по названию, дедлайну или описанию"
    return searchBar


func updateUIView(_ uiView: UISearchBar, context _: UIViewRepresentableContext<SearchBar>) 
    uiView.text = text


如何在 SwiftUI 中实现隐藏和隐藏动画?

【问题讨论】:

你找到方法了吗? 它可以帮助你***.com/questions/59710150/… 【参考方案1】:

SwiftUI 3.0 (iOS 15.0+)

Apple 以非常原生的方式使之成为可能。

您只需将.searchable() 修饰符与您想要搜索的视图一起使用,并确保您将NavigationView 作为您的视图的父级。

示例

struct CountriesView: View 
    let countries = ["United States", "India", "Ukraine", "Russia", "Sweden"]
    @State var search: String = ""

    var body: some View 
        NavigationView 
            List(countries.filter(
                // we filter our country list by checking whether country name
                // does contain search string or not
                $0.lowercased().contains(search.lowercased()) 
           ))  country in
                Text(country)
            .searchable(text: $search)
        
    

顺便说一句,您可以使用计算属性以更方便的方式过滤您的数组。

然后,示例中过滤器的计算属性将是:

var searchResults: [String] 
   return countries.filter($0.lowercased().contains(search.lowercased()))

所以,List 将如下所示:

List(searchResults) 
    // ...

附言您可以在this swift.org article中了解更多关于计算变量和属性的信息

【讨论】:

以上是关于如何在 SwiftUI 中滚动时隐藏 SearchBar?的主要内容,如果未能解决你的问题,请参考以下文章

用户滚动时隐藏导航栏

SwiftUI - 隐藏 ScrollView 的指示器使其停止滚动

在 SwiftUI 中滚动时,许多项目列表崩溃,我该如何解决?

当视图在 SwiftUI 中消失时如何隐藏 NavigationBar?

在 SwiftUI 中滑动列表时隐藏导航栏

SwiftUI当总内容宽度小于屏幕宽度时,如何在动态水平滚动视图中居中内容