You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:36:03