我已经构建了一个带有动画的视图,一切似乎都工作正常,但后来我发现它只适用于第一次,而不适用于第二次。由于我是 Swift 编程的新手,我不知道问题出在哪里。我查看了不同的动画教程,并且所有教程的工作方式都与我实现它的方式相同。我写了一个小样本来重现该问题:
import SwiftUI
struct BugSample: View {
var body: some View {
TabView {
ContentView()
.tabItem {
Label("BUG", systemImage: "checkmark")
}
}
}
}
struct Person: Identifiable, Hashable {
var id: UUID
var name: String
init(id: UUID = UUID(), name: String) {
self.id = id
self.name = name
}
}
struct ContentView: View {
@State private var selectedPerson: Person?
var body: some View {
NavigationSplitView {
PersonsListView(selectedPerson: $selectedPerson)
} detail: {
if let selectedPerson {
GalleryView()
} else {
Text("Should not reach here")
}
}
}
}
struct PersonsListView: View {
@Binding var selectedPerson: Person?
var data = [Person(name: "A"), Person(name: "B"), Person(name: "C")]
var body: some View {
List(data, selection: $selectedPerson) { entry in
Text(entry.name)
.onTapGesture {
selectedPerson = entry
}
.listRowSeparator(.hidden)
}
}
}
struct GalleryView: View {
var body: some View {
NavigationStack {
VStack(spacing: 20) {
ProgressView()
CircularView()
}
}
}
}
struct CircularView: View {
@State var scale = 1.0
var body: some View {
Circle()
.frame(width: 200, height: 200)
.scaleEffect(scale)
.onAppear {
let baseAnimation = Animation.easeInOut(duration: 1)
let repeated = baseAnimation.repeatForever(autoreverses: true)
withAnimation(repeated) {
scale = 0.5
}
}
}
}
当您单击 3 个条目之一时,圆圈将正确动画,当我返回并再次打开屏幕时,它将不起作用。我还添加了一个 ProgressView 来检查它是否有效并且它正在旋转,所以问题可能出在代码中。我的第一个建议是 NavigationSplitView,因为我发现存在缺少动画的问题,但它与我的问题不同(https://forums.developer.apple.com/forums/thread/728132)。有人对这个问题有想法吗?在过去的几个小时里我尝试了几种方法,但我找不到让动画再次工作的方法。
由于某种原因,正在调用
.onAppear
(以及onDisappear
,如果存在),但动画不会第二次重新启动。要修复此问题,请改为使用以下命令触发动画
task
: