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

SwiftUI底部Sheet搜索栏顶部空白与拖动指示器重叠问题修复

问题及现有情况

问题现象

问题演示动图

当前遇到两个UI问题:

  • 底部Sheet的搜索栏未激活时,顶部存在多余空白
  • 搜索栏激活后,与拖动指示器发生重叠

现有代码

SheetView 实现

struct SheetView: View {
    @State var isPresented: Bool = true
    @StateObject var searchViewModel = SearchViewModel()
    @State var text: String = ""
    @State var isSearchActive : Bool = false
    @State var defaultSelectedDetent : PresentationDetent = .fraction(0.35)
    
    var body: some View {
        VStack {
            Text("Hello world")
            Color(UIColor.systemGray)
        }
        .sheet(isPresented: $isPresented){
            DefaultView(..., isSearchActive: $searchViewModel.isSearchActive){
                index in
                searchViewModel.selectSearch(selectionIndex: index)
            }
            .searchable(text: $searchViewModel.query, placement: .navigationBarDrawer(displayMode: .always))
                .presentationDetents([.fraction(0.1),.fraction(0.35), .large], selection: $defaultSelectedDetent)
                .presentationDragIndicator(.visible)
                .presentationBackgroundInteraction(.enabled)
                .onChange(of: searchViewModel.isSearchActive){newValue in
                    if newValue{
                        defaultSelectedDetent = .large
                    }else{
                        defaultSelectedDetent = .fraction(0.35)
                    }
                }
                //.padding(.top, $searchViewModel.isSearchActive.wrappedValue ? 12 : -32)
        }
    }
}

DefaultView 实现

struct DefaultView: View{
    ...
    @Environment(\.isSearching) private var isSearching
    @Binding var isSearchActive: Bool
    ...
    
    var body: some View {
        NavigationStack {
            List {
                ...
            }
            .listStyle(.plain)
            .navigationTitle("")
            .navigationBarTitleDisplayMode(.inline)
            .onChange(of: isSearching){newValue in
                isSearchActive = newValue
            }
        }
    }
}

已尝试方案及问题

尝试通过环境值控制状态,调整padding来修复布局问题(代码中已注释),但在不修改presentationDetent的情况下,动画效果非常糟糕:

padding调整动图

另外无法隐藏导航栏,否则搜索栏会一并被隐藏,现寻求更简洁的实现方式。


内容的提问来源于stack exchange,提问作者Samuel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:05:54