我需要实现动画页面控件之类的东西。而且,如果可能的话,我也不想使用与UIKit的集成。我有pages
数组,其中包含4个需要切换的视图。我通过使用计时器更改progress
变量的值来创建动画本身。我现在有以下代码
@State var pages: [PageView]
@State var currentIndex = 0
@State var nextIndex = 1
@State var progress: Double = 0
var body: some View {
ZStack {
Button(action: {
self.isAnimating = true
}) { shape.onReceive(timer) { _ in
if !self.isAnimating {
return
}
self.refreshAnimatingViews()
}
}.offset(y: 300)
pages[currentIndex]
.offset(x: -CGFloat(pow(2, self.progress)))
pages[nextIndex]
.offset(x: CGFloat(pow(2, (limit - progress))))
}
}
动画效果很好-当前页面向左移动直到消失,然后从右边显示下一页代替它。在动画结束时,我向两个索引都添加了1
,并将progress
重置为0
。但是,一旦动画(不是完全动画,我只是使用计时器更改进度的值,并手动生成每个状态)结束,索引为1
的页面就会换回到索引为{{1}的页面}。如果我使用调试器进行检查,则0
和currentIndex
的值是正确的-nextIndex
和1
,但是动画后显示的页面始终是我开始的页面(索引为{ {1}})。有人知道为什么会这样吗?
完整代码如下
2
在SceneDelegate中:
0
答案 0 :(得分:1)
以下解决方案有效。我认为问题是在 SwiftUI 尝试进行差异化和更新视图时切换视图不是 SwiftUI 擅长的事情。
因此只需使用相同的两个 PageView 视图并根据当前的 index 换出它们的内容。
.weak