SwiftUI页面控件实现

时间:2019-08-07 09:53:11

标签: swiftui

我需要实现动画页面控件之类的东西。而且,如果可能的话,我也不想使用与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}的页面}。如果我使用调试器进行检查,则0currentIndex的值是正确的-nextIndex1,但是动画后显示的页面始终是我开始的页面(索引为{ {1}})。有人知道为什么会这样吗?

完整代码如下

2

在SceneDelegate中:

0

1 个答案:

答案 0 :(得分:1)

以下解决方案有效。我认为问题是在 SwiftUI 尝试进行差异化和更新视图时切换视图不是 SwiftUI 擅长的事情。

因此只需使用相同的两个 PageView 视图并根据当前的 index 换出它们的内容。

.weak