【发布时间】:2020-05-26 20:03:25
【问题描述】:
我最近发现当一个动画永远运行并且View通过TabView切换时,动画状态就丢失了。虽然这是预期的行为,但我想了解在 TabView 视图更改后,是否有办法在返回动画视图时保持动画运行?
这是一个简单的示例,展示了 SwiftUI 中的行为:
import SwiftUI
class MyState: ObservableObject {
@Published var animate: Bool = false
}
struct ContentView: View {
var body: some View {
TabView {
AnimationView()
.tabItem {
Image(systemName: "eye")
}
Text("Some View")
.tabItem {
Image(systemName: "play")
}
}
}
}
struct AnimationView: View {
@EnvironmentObject var myState: MyState
var body: some View {
VStack {
Text(self.myState.animate ? "Animation running" : "Animation stopped")
.padding()
ZStack {
Circle()
.stroke(style: StrokeStyle(lineWidth: 12.0))
.foregroundColor(Color.black)
.opacity(0.3)
Circle()
.trim(
from: 0,
to: self.myState.animate ? 1.0 : 0.0
)
.stroke(
style: StrokeStyle(lineWidth: 12.0, lineCap: .round, lineJoin: .round)
)
.animation(
Animation
.linear(duration: self.myState.animate ? 1.0 : 0.0)
.repeatForever(autoreverses: false)
)
}.frame(width: 200, height: 200)
Button(action: {
self.myState.animate.toggle()
}) {
Text("Toggle animation")
.padding()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environmentObject(MyState())
}
}
您可以在下面看到行为:
我希望控制的是返回到动画运行的视图并查看它在当前时间的状态 - 也就是说,想象在切换视图并返回到动画时动画正在循环查看在“运行时间”或“实时”的正确位置找到它。
Obs:状态在 MyState 和 EnvironmentObject 中处理,它不是视图中的本地 (@State)
【问题讨论】: