Construí uma view com animação e tudo parecia funcionar bem, mas depois descobri que só funciona na primeira vez e não na segunda. Como sou um novato em programação Swift, não tenho ideia de onde está o problema. Vi diferentes tutoriais de animações e todos funcionaram da mesma maneira que os implementei. Escrevi uma pequena amostra para reproduzir o problema:
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
}
}
}
}
Ao clicar em uma das 3 entradas, o círculo será animado corretamente e quando eu voltar e abrir a tela novamente, não funcionará. Adicionei também um ProgressView para verificar se funciona e está girando, então talvez o problema esteja no código. Minha primeira sugestão foi o NavigationSplitView porque vi que há um problema de falta de animação, mas é diferente do meu problema ( https://forums.developer.apple.com/forums/thread/728132 ). Alguém tem uma idéia para esse problema, tentei de várias maneiras nas últimas horas, mas não encontrei uma maneira de fazer a animação funcionar novamente.
Por algum motivo,
.onAppear
(e tambémonDisappear
, quando presente) estão sendo chamados, mas a animação não reinicia na segunda vez.Para corrigir, acione a animação usando
task
: