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的情况下,动画效果非常糟糕:

另外无法隐藏导航栏,否则搜索栏会一并被隐藏,现寻求更简洁的实现方式。
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

