Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI如何制作下一个和下一个动画?_Swiftui - Fatal编程技术网

SwiftUI如何制作下一个和下一个动画?

SwiftUI如何制作下一个和下一个动画?,swiftui,Swiftui,我用3个页面和“下一步”、“上一步”按钮制作了一个示例应用程序 当我点击“下一步”时,动画就完美了:旧的内容放在左边,新的内容放在右边 然而,我正在努力使“返回”动画同时工作良好 目标:单击“后退”时,旧内容应位于右侧,新内容应位于左侧。(用于“后退”的动画应与用于“下一步”的动画相反) 你知道如何做到这一点吗 下面是“下一步”的完美过渡 返回导航时,需要反转转换 这里是可能的方法(也在一个地方进行了转换,并更正了动画,使其在任何地方都能工作,包括预览) 使用Xcode 12/iOS 14进行

我用3个页面和“下一步”、“上一步”按钮制作了一个示例应用程序

当我点击“下一步”时,动画就完美了:旧的内容放在左边,新的内容放在右边

然而,我正在努力使“返回”动画同时工作良好

目标:单击“后退”时,旧内容应位于右侧,新内容应位于左侧。(用于“后退”的动画应与用于“下一步”的动画相反)

你知道如何做到这一点吗

下面是“下一步”的完美过渡


返回导航时,需要反转转换

这里是可能的方法(也在一个地方进行了转换,并更正了动画,使其在任何地方都能工作,包括预览)

使用Xcode 12/iOS 14进行测试

struct ContentView:View{
@状态变量页:Int=0
@状态私有变量isBack=false//
struct ContentView: View {
    @State var page: Int = 0
    
    var body: some View {
        
        VStack {
            HStack {
                Button(action: { withAnimation() { self.page = self.page - 1 } }) {
                    Text("Back")
                }
                
                Spacer()
                
                Button(action: { withAnimation() { self.page = self.page + 1 }}) {
                    Text("Next")
                }
            }
            Spacer()
            
            if page == 0 {
                PageView(name: "First page", color: .brown)
                    .transition(AnyTransition.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
            } else if page == 1 {
                PageView(name: "Second page", color: .systemGreen)
                    .transition(AnyTransition.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
            } else if page == 2 {
                PageView(name: "Third page", color: .systemBlue)
                    .transition(AnyTransition.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
            }
        }
    }
}

struct PageView: View {
    var name: String
    var color: UIColor
    var body: some View {
        HStack {
            Spacer()
            Text(name)
            Spacer()
        }
        .padding()
        .padding(.vertical, 50)
        .background(Color(color))
    }
}
struct ContentView: View {
    @State var page: Int = 0

    @State private var isBack = false   // << reverse flag (not animatable)
    var body: some View {

        VStack {
            HStack {
                Button(action: {
                    self.isBack = true
                    self.page = self.page - 1
                }) {
                    Text("Back")
                }

                Spacer()

                Button(action: {
                    self.isBack = false
                    self.page = self.page + 1
                }) {
                    Text("Next")
                }
            }
            Spacer()

            Group {
                if page == 0 {
                    PageView(name: "First page", color: .brown)
                } else if page == 1 {
                    PageView(name: "Second page", color: .systemGreen)
                } else if page == 2 {
                    PageView(name: "Third page", color: .systemBlue)
                }
            }.transition(AnyTransition.asymmetric(
                insertion:.move(edge: isBack ? .leading : .trailing),
                removal: .move(edge: isBack ? .trailing : .leading))
            )
            .animation(.default, value: self.page)   // << animate here by value
        }
    }
}