iOS 15下使用.searchable修饰符的搜索栏如何设置默认显示?
iOS 15 下 .searchable 搜索栏默认可见解决方案
针对iOS 15中系统.searchable修饰符默认隐藏搜索栏、设置placement: .navigationBarDrawer(.always)会强制转为inline标题的问题,以下是经过验证的可行方案:
方案1:滚动偏移触发法(无审核风险,推荐)
利用列表加载完成后的主动微小滚动操作,触发系统自动展示搜索栏,完全保留大标题样式,无需修改searchable配置。
import SwiftUI struct SearchDemoView: View { @State private var searchText = "" // 列表首项唯一标识 private let firstItemId = "first_list_item" var body: some View { NavigationView { ScrollViewReader { scrollProxy in List { // 列表首个元素绑定id Text("占位结果") .id(firstItemId) // 剩余列表内容 ForEach(1..<30) { index in Text("结果\(index)") } } .onAppear { // 无动画滚动到首项顶部,触发搜索栏展示 withAnimation(.none) { scrollProxy.scrollTo(firstItemId, anchor: .top) } } } .navigationTitle("备忘录") .navigationBarTitleDisplayMode(.large) // 保持默认searchable配置,无需修改placement .searchable(text: $searchText) } } }
- 优点:完全使用公开API,无审核风险,代码侵入性极低,保留系统搜索栏所有原生功能(搜索建议、取消按钮、自动高亮等)
- 缺点:仅适配iOS 15+,依赖ScrollViewReader的滚动逻辑
方案2:自定义搜索栏方案(全版本兼容,灵活度最高)
放弃系统.searchable修饰符,在导航栏的principal位置插入自定义搜索栏,完全不受系统滚动逻辑控制,实现和系统备忘录完全一致的始终可见效果。
import SwiftUI // 自定义搜索栏组件,可按需扩展功能 struct CustomSearchBar: View { @Binding var searchText: String @FocusState private var isFocused: Bool var body: some View { HStack(spacing: 8) { Image(systemName: "magnifyingglass") .foregroundColor(.secondary) TextField("搜索", text: $searchText) .focused($isFocused) if !searchText.isEmpty { Button { searchText = "" } label: { Image(systemName: "xmark.circle.fill") .foregroundColor(.secondary) } } if isFocused { Button("取消") { searchText = "" isFocused = false } .foregroundColor(.accentColor) } } .padding(.horizontal, 8) .padding(.vertical, 7) .background(Color(.systemGray6)) .cornerRadius(10) } } // 页面调用代码 struct SearchDemoView: View { @State private var searchText = "" var body: some View { NavigationView { List { // 列表所有内容 ForEach(0..<30) { index in Text("结果\(index)") } } .navigationTitle("备忘录") .navigationBarTitleDisplayMode(.large) .toolbar { ToolbarItem(placement: .principal) { CustomSearchBar(searchText: $searchText) } } } } }
- 优点:适配iOS 13+所有版本,搜索栏展示逻辑完全可控,可自定义样式、添加搜索历史、语音输入等扩展功能
- 缺点:需要自行实现搜索栏的所有交互逻辑,没有系统自带的搜索建议、快捷输入等原生功能
方案3:iOS 16+ 原生API方案
如果应用最低支持版本可以升级到iOS 16,直接使用官方新增的displayMode配置即可,无需额外适配:
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
该配置不会强制将大标题转为inline样式,完全符合系统备忘录的交互效果。
内容的提问来源于stack exchange,提问作者Andrei Matei
相关产品推荐
相关产品推荐

