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