我想从内容视图跳到ViewDrag,并通过拖动在View123之间跳转.但现在,从ViewDrag的预览中,我可以成功地拖动和跳转.但是如果我首先从内容视图跳到ViewDrag,我就不能再在ViewDrag中使用手势了! 我的最小代码如下:

    @State var Jump = false
    var body: some View {
        NavigationStack {
        VStack {
                Button(action: {
                    Jump = true
                }, label: {
                    Text("JUMP")
                })
            }
        .navigationDestination(isPresented: $Jump, destination: {
            ViewDrag()
        })
        }
    }
}

struct ViewDrag: View {
    @State private var currentPage = 0
    @GestureState private var translation: CGFloat = 0
    var body: some View {
        NavigationStack {
            if currentPage == 0 {
                View1(nextPage: $currentPage)
                    .transition(.customTransition)
            } else if currentPage == 1 {
                View2(nextPage: $currentPage)
                    .transition(.customTransition)
            } else if currentPage == 2 {
                View3(nextPage: $currentPage)
                    .transition(.customTransition)
            }
        }
        .gesture(
            DragGesture()
                .updating($translation, body: { value, state, _ in
                    state = value.translation.width
                })
                .onEnded({ value in
                    if value.translation.width < 0 && currentPage < 4 {
                        withAnimation {
                            currentPage += 1
                        }
                    } else if value.translation.width > 0 && currentPage > 0 && currentPage != 4 {
                        withAnimation {
                            currentPage -= 1
                        }
                    }
                })
        )
    }
}
    extension AnyTransition {
        static var customTransition: AnyTransition {
            let transition = AnyTransition.move(edge: .leading)
                .combined(with: .opacity)
            
            return .asymmetric(insertion: transition, removal: transition)
        }
    }
struct View1: View {
    @Binding var nextPage: Int
    @GestureState private var translation: CGFloat = 0
    var body: some View {
        Text("I am View1")
    }
}

struct View2: View {
    @Binding var nextPage: Int
    @GestureState private var translation: CGFloat = 0
    var body: some View {
        Text("I am View2")
    }
}

struct View3: View {
    @Binding var nextPage: Int
    @GestureState private var translation: CGFloat = 0
    var body: some View {
        Text("I am View3")
    }
}

任何帮助或建议都将不胜感激!

推荐答案

问题出在您的ViewDrag视图中.您将该手势附加到一个NavigationStack,但该视图本身是透明的,不会捕获触动.如果您设法将文本拖到子视图中,您将看到您的示例实际工作了!

现在,我不认为嵌套的NavigationController是必要的,也不是一个好主意.但是您可能需要一个能够捕捉这些细节的容器视图.您可以使用ZStack、Color.lear和指定Content Shape按如下方式执行此操作:

struct ViewDrag: View {
    @State private var currentPage = 0
    @GestureState private var translation: CGFloat = 0

    var body: some View {
        ZStack {
            // make the ZStack fill the available space
            Color.clear 

            if currentPage == 0 {
                View1(nextPage: $currentPage)
                    .transition(.customTransition)
            } else if currentPage == 1 {
                View2(nextPage: $currentPage)
                    .transition(.customTransition)
            } else if currentPage == 2 {
                View3(nextPage: $currentPage)
                    .transition(.customTransition)
            }
        }
        // make sure the ZStack captures touches in the full
        // rectangle it occupies (even when transparent)
        .contentShape(Rectangle())
        .gesture(
        ...

Swift相关问答推荐

SwiftData:线程1:&Quot;NSFetchRequest找不到实体名称';提醒&q;的NSEntityDescription

从后台线程获取@发布属性的值(不更改它)是正确的吗?

通常从数组调用的SWIFT静态协议函数

SwiftUI-如何使用剩余时间制作倒计时计时器

可以';t在标记为@Observable的类上使用属性包装

在一行语句中比较Date.now的相等性是否安全

如何使用模型在 SwiftUI 的列表中进行搜索

SwiftUI如何能够在Text中使用字符串字面量来创建LocalizedStringKey?

如何在SwiftUI中更改NSTextView中的 Select colored颜色 ?

如何修改下面的代码,使图像 Select 的顺序与使用快速并发的图像呈现的顺序相匹配?

URL appendPathComponent(_:) 已弃用?

如何将视图添加到多行文本视图的末尾?

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

SwiftUI:当 currentIndex 值更改时,数组中的第 n 个视图是否已换出?

iOS16 Bug 键盘在表单解雇 SwiftUI 时打破布局

RxSwift 提高性能

Swift - 如何更新多目录中的对象

在 Swiftui 中是否有一种简单的方法可以通过捏合来放大图像?

快速延迟加载属性

判断用户是否登录到 iCloud?Swift /iOS