我正在测试 SwiftUI 的功能 .searchable()。但似乎搜索栏上方总是有一个空格。由于可搜索内容嵌入在导航栏中,因此我将空间理解为导航栏项目所在的位置。但有没有办法去掉这个空间,让搜索栏看起来像 Instagram 中的那样呢?我尝试将导航栏样式更改为内联,如下面的代码,但上面仍然有一些空间。搜索栏的位置背后有什么逻辑吗?
NavigationView{
SearchView(searchText: $searchText)
.navigationBarTitleDisplayMode(.inline)
}
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always), suggestions: {
ForEach(searchResults, id: \.self){result in
Text(result).searchCompletion(result)
}
})
Run Code Online (Sandbox Code Playgroud)
小智 2
我刚刚找到了删除它的方法。删除搜索栏上方空间的方法是避免使用内置的 .searchable 修饰符,而是通过创建 UIViewRepresentable SwiftUI 视图来使用 UIKit 的 UISearchBar。这使您可以完全控制搜索栏的外观和行为。以下是如何执行此操作的示例:
首先,创建 SearchBar 结构:
import SwiftUI
struct SearchBar: UIViewRepresentable {
@Binding var text: String
var placeholder: String
func makeUIView(context: UIViewRepresentableContext<SearchBar>) -> UISearchBar {
let searchBar = UISearchBar(frame: .zero)
searchBar.delegate = context.coordinator
searchBar.searchBarStyle = .minimal
searchBar.placeholder = placeholder
searchBar.autocapitalizationType = .none
return searchBar
}
func updateUIView(_ uiView: UISearchBar, context: UIViewRepresentableContext<SearchBar>) {
uiView.text = text
}
func makeCoordinator() -> SearchBar.Coordinator {
return Coordinator(text: $text)
}
class Coordinator: NSObject, UISearchBarDelegate {
@Binding var text: String
init(text: Binding<String>) {
_text = text
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
text = searchText
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在 SwiftUI 视图中使用 SearchBar,如下所示:
struct ContentView: View {
@State private var searchText = ""
var body: some View {
VStack {
SearchBar(text: $searchText, placeholder: "Search")
// Your other views here...
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将在 SwiftUI 视图的最顶部为您提供一个搜索栏。
| 归档时间: |
|
| 查看次数: |
1112 次 |
| 最近记录: |