我制作了包含 3 个页面和“下一步”、“后退”按钮的示例应用程序。
当我单击“下一步”时,动画是完美的:旧内容位于左侧,新内容来自右侧。
然而,我正在努力使“返回”动画同时正常工作。
目标:当单击“返回”时,旧内容应位于右侧,新内容应位于左侧。(“后退”的动画应与“下一步”的动画相反)
知道如何实现这一点吗?
下面是“下一步”的完美过渡
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))
}
}
Run Code Online (Sandbox Code Playgroud)
返回时需要反转转换。
这是可能的方法(也在一个地方进行了过渡并修正了动画以在任何地方工作,包括预览)。
使用 Xcode 12 / iOS 14 进行测试。
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3402 次 |
| 最近记录: |