如何从 swiftui 手势启动视图

How to launch a View from a swiftui gesture

ios13 中的手势似乎不允许使用 .sheet 来启动模态视图,也不允许使用 .alert。 Alerts 和 Sheets 似乎只适用于按钮、图像和其他对象,但不适用于手势。除了使用存在隐藏等问题的按钮之外,还有其他解决方法吗?

                ZStack(alignment: .top) {
                    
                    MapView(currentTab: self.$selection, mapViewModel: self.mapViewModel)
                        .edgesIgnoringSafeArea(.all)
                        .environment(\.colorScheme, .light)
                        
                        .overlay(Rectangle()
                            .opacity(0.1)
                            //.background(Color.clear)
                            .background(Image("Cursor_Flecha_4.svg")
                                .resizable()
                                .aspectRatio(contentMode: .fit)
                                .scaledToFit()
                                //.frame(width: 32.0, height: 32.0))
                                .frame(width: geo.size.width, height: geo.size.height * 0.15))
                            
                            .border(Color.red, width: 4)
                            
                            .frame(width: geo.size.width, height: geo.size.height * 0.25)
                            
                            .gesture(
                                DragGesture(minimumDistance: 50)
                                    .onEnded { gesture in
                                        
                                if ((gesture.translation.width >= 50) && (abs(gesture.translation.height) <= 20)) {
                                    print("swipe right detected")
//                                    GetRouteName()
                                    .sheet(isPresented: self.$showView) {
                                        GetRouteName(onDismiss: {
                                            self.showView = false
                                            self.mapViewModel.saveRoute(coreDM: self.coreDM, routeName: self.routeName)
                                        }, routeName: self.$routeName) //.offset(y: self.showView ? 0 : 1000)
                                    }
                                } else {
       

您不能将 .sheet 放入 DragGesture().onEnded 闭包中。相反,用你的 sheet.

创建一个状态 属性 和 link
struct ContentView: View {
   @State private var showSheet = false 
   
   var body: some View {
      MapView(...)
         .gesture(
             DragGesture()
                 .onEnded { gesture in 
                     if ((gesture.translation.width >= 50) && (abs(gesture.translation.height) <= 20)) {
                         print("swipe right detected")

                         self.showSheet = true
                     }
                 }
         )
         .sheet(isPresented: self.$showSheet) { ... }
   }