У меня есть этот код:
Group{
if self.done{
Image(systemName: "plus").font(.system(size: 40)).foregroundColor(.gray)
.padding().overlay(Circle().stroke(Color.gray, lineWidth: 3)).opacity(0.6)
}
else{
Button(action: {self.showSearchTrash = 1}){
Image(systemName: "plus").font(.system(size: 40)).foregroundColor(green)
.padding().overlay(Circle().stroke(green, lineWidth: 3).scaleEffect(1+self.animationAmount).animation(Animation.easeInOut(duration: 1).repeatForever(autoreverses: true)).onAppear {self.animationAmount = 0.1})
}
}
}.padding(.bottom, 5)
И намерение состоит в том, что если self.done
равно false
, круг на кнопке с плюсом будет бесконечно расширяться и сжиматься.
Это работает. Однако, если я использую переключатель, чтобы установить self.done
на true
, а затем верну его обратно на false
, анимация больше не будет происходить. Я знаю, что проблема не в переключателе, потому что он снова становится зеленым.
Кроме того, отсутствие .
перед green
намеренно - я определил конкретный цвет green
.
Любая идея, почему анимация перестает работать / как это исправить?
Вы можете указать Animation
в блоке withAnimation
и создать отдельные функции для запуска/остановки анимации.
Вот возможное решение:
struct ContentView: View {
@State private var done = false
@State private var animationAmount: CGFloat = 0
var body: some View {
VStack {
Toggle("Done", isOn: $done)
plusImage
.opacity(done ? 0.6 : 1)
.foregroundColor(done ? .gray : .green)
}
.onAppear(perform: startAnimation)
.onChange(of: done) { done in
if done {
stopAnimation()
} else {
startAnimation()
}
}
}
var plusImage: some View {
Image(systemName: "plus")
.font(.system(size: 40))
.padding()
.overlay(
Circle()
.stroke(Color.gray, lineWidth: 3)
.scaleEffect(1 + animationAmount)
)
}
}
private extension ContentView {
func startAnimation() {
withAnimation(Animation.easeInOut(duration: 1).repeatForever()) {
animationAmount = 0.1
}
}
func stopAnimation() {
withAnimation {
animationAmount = 0
}
}
}
На самом деле отлично работает как есть с Xcode 12.1/iOS 14.1, поэтому вы можете наблюдать либо ошибку новой версии iOS, либо результат какого-то другого кода.
В любом случае, я бы добавил масштабирование отключения при исчезновении кнопки:
Button(action: {}){
Image(systemName: "plus").font(.system(size: 40)).foregroundColor(green)
.padding().overlay(Circle().stroke(green, lineWidth: 3).scaleEffect(1+self.animationAmount).animation(Animation.easeInOut(duration: 1).repeatForever(autoreverses: true)))
}
.onAppear {self.animationAmount = 0.1} // << put here !!
.onDisappear {self.animationAmount = 0} // << add this !!
Вы можете добавить больше кода?