SwiftUI中如何让导航子视图NavigationA显示拖拽指示器?
解决SwiftUI导航子视图无法显示拖拽指示器的问题
问题根源
NavigationA是通过navigationDestination在SheetA的导航栈内跳转的子视图,它不属于独立的模态视图,而是共享SheetA所在模态容器的配置。因此直接给NavigationA添加presentationDragIndicator(.visible)不会生效——所有模态相关属性(包括拖拽指示器、detents)都由最外层的模态视图(SheetA的sheet)控制。
解决方案
有两种可行方式,可根据需求选择:
方案一:将NavigationA作为独立模态视图弹出
把原来的navigationDestination替换为sheet,让NavigationA成为独立模态视图,即可自主控制拖拽指示器:
修改SheetA代码:
struct SheetA: View { @State var showSubView: Bool = false var body: some View { NavigationStack { VStack { Text("Show Navigation View").foregroundStyle(Color.blue).font(.title).onTapGesture { self.showSubView.toggle() } } // 替换navigationDestination为sheet .sheet(isPresented: $showSubView) { NavigationA() } .presentationDetents([.large]) .presentationDragIndicator(.hidden) .interactiveDismissDisabled() } } }
NavigationA代码保持不变,它的presentationDragIndicator(.visible)会正常生效。
方案二:在父视图中动态切换模态配置
若必须使用navigationDestination跳转,可在SheetA中根据showSubView状态,动态调整模态容器的拖拽指示器和detents:
修改SheetA代码:
struct SheetA: View { @State var showSubView: Bool = false var body: some View { NavigationStack { VStack { Text("Show Navigation View").foregroundStyle(Color.blue).font(.title).onTapGesture { self.showSubView.toggle() } } .navigationDestination(isPresented: self.$showSubView) { NavigationA() } // 根据导航状态切换detents .presentationDetents(showSubView ? [.medium, .large] : [.large]) // 根据导航状态切换拖拽指示器显示/隐藏 .presentationDragIndicator(showSubView ? .visible : .hidden) .interactiveDismissDisabled() } } }
同时移除NavigationA中的模态相关修饰符:
struct NavigationA: View { var body: some View { VStack { Text("This is the navigation view. \nThis view should have drag handler on top") } .navigationBarBackButtonHidden() } }
跳转至NavigationA时,父模态容器会自动切换拖拽指示器为可见,并调整支持的detents。
内容的提问来源于stack exchange,提问作者tech_human
相关产品推荐
相关产品推荐

