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

如何让iPad上SwiftUI的.searchable搜索框保持全屏宽度

如何让iPadOS上SwiftUI的搜索框聚焦时保持全屏宽度?

我正在开发一个SwiftUI示例应用,使用带.sidebarAdaptable样式的TabView,包含两个占位视图和一个带搜索功能的Tab(role为.search)。在iPadOS 26上,搜索框初始状态是全屏宽度,但获得焦点后会自动缩窄,希望实现类似iPadOS 26 beta 3中TV应用的搜索框样式——聚焦时仍保持全屏宽度。

原代码

struct ContentView: View {
    var body: some View {
        AppTabsView()
    }
}

struct AppTabsView: View {
    var body: some View {
        TabView {
            Tab(role: .search) {
                SearchView()
            }
            
            Tab("Foo", systemImage: "star") {
                Text("This view is under development.")
            }

            Tab("Bar", systemImage: "star") {
                Text("This view is under development.")
            }
        }
        .tabViewStyle(.sidebarAdaptable)
    }
}

struct SearchView: View {
    @State private var searchText = ""
    @State private var isSearchPresented = false
    
    let allMedia = [
        "Foo",
        "Bar",
        "Zoo",
        "Boo"
    ]
    
    var filteredMedia: [String] {
        if searchText.isEmpty {
            allMedia
        } else {
            allMedia.filter { $0.localizedStandardContains(searchText) }
        }
    }
    
    var body: some View {
        NavigationStack {
            List(filteredMedia, id: \.self) { title in
                Text(title)
            }
            .searchable(text: $searchText, isPresented: $isSearchPresented, placement: .automatic, prompt: "Search")
            .navigationTitle("Search")
        }
    }
}

状态截图

初始状态:
Initial State

聚焦状态(问题表现):
Focused State

理想效果(参考TV应用):
Ideal option - like in TV app on iPadOS 26 beta 3

解决方案

通过调整searchable的布局配置并稳定导航栏结构,可实现聚焦时搜索框保持全屏宽度的效果,修改后的SearchView代码如下:

struct SearchView: View {
    @State private var searchText = ""
    @State private var isSearchPresented = false
    
    let allMedia = [
        "Foo",
        "Bar",
        "Zoo",
        "Boo"
    ]
    
    var filteredMedia: [String] {
        searchText.isEmpty ? allMedia : allMedia.filter { $0.localizedStandardContains(searchText) }
    }
    
    var body: some View {
        NavigationStack {
            List(filteredMedia, id: \.self) { title in
                Text(title)
            }
            .searchable(
                text: $searchText,
                isPresented: $isSearchPresented,
                placement: .navigationBarDrawer(displayMode: .always),
                prompt: "Search"
            )
            .navigationTitle("Search")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    EmptyView()
                }
            }
        }
    }
}

关键修改说明

  • 修改searchable的placement:使用.navigationBarDrawer(displayMode: .always)替代.automatic,强制搜索框始终以抽屉式布局占据导航栏全屏宽度,不会在聚焦时切换窄幅样式。
  • 固定导航栏标题模式:设置.navigationBarTitleDisplayMode(.inline),避免标题布局变化干扰搜索框的宽度计算。
  • 添加空导航栏项:在导航栏右侧添加空的ToolbarItem,稳定导航栏的整体布局结构,防止搜索框因右侧无元素而自动收缩。

内容的提问来源于stack exchange,提问作者Igor R.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 17:23:13