SwiftUI iOS15如何设置searchable搜索栏启动即显示且滚动不隐藏
解决SwiftUI iOS15 .searchable搜索栏默认隐藏、滚动时自动隐藏的问题
你可以通过搭配导航栏配置和searchable修饰符参数实现需求,无需自定义搜索栏,以下是具体实现方案:
1. 实现启动时直接展示搜索栏
默认状态下搜索栏会在导航栏大标题模式下默认折叠,你可以选择两种方案适配:
- 方案一:将导航栏标题显示模式改为
.inline,搜索栏会默认展开显示,适合不需要大标题的页面 - 方案二:如果需要保留大标题模式,可以在页面加载时触发导航栏尺寸刷新,强制展示搜索栏
示例代码如下:
struct SearchDemoView: View { @State private var searchText = "" var body: some View { // iOS15 用NavigationView替换NavigationStack即可,逻辑完全一致 NavigationStack { List(0..<50, id: \.self) { index in Text("测试条目 \(index)") } .navigationTitle("页面标题") // 方案一:开启inline标题模式,默认展示搜索栏 .navigationBarTitleDisplayMode(.inline) // 方案二:如果保留大标题模式,添加onAppear配置 .onAppear { UINavigationBar.appearance().prefersLargeTitles = true UINavigationBar.appearance().sizeToFit() } } } }
2. 实现滚动时不隐藏搜索栏
只需要给.searchable修饰符指定placement参数为.navigationBarDrawer(displayMode: .always),即可强制搜索栏始终保持展示状态,不会跟随页面滚动收起。
结合第一点需求的完整代码如下:
struct SearchDemoView: View { @State private var searchText = "" var body: some View { NavigationStack { List(0..<50, id: \.self) { index in Text("测试条目 \(index)") } .navigationTitle("页面标题") .navigationBarTitleDisplayMode(.inline) // 核心配置:指定搜索栏显示模式为永久展示 .searchable( text: $searchText, placement: .navigationBarDrawer(displayMode: .always), prompt: "请输入搜索内容" ) } } }
内容的提问来源于stack exchange,提问作者Dmitriy
相关产品推荐
相关产品推荐

