Попытка анимировать SwiftUI
представление. Работает отлично в первый раз, но потом ничего не делает.
self.pressed
начинается как false
. Я установил его на true
, а затем переключил обратно на false
.
Я хочу увеличить его, а затем уменьшить его при нажатии кнопки.
Что мне здесь не хватает?
Button(action: {
withAnimation(.linear(duration: 3)) {
self.pressed = true
}
withAnimation(.linear(duration: 3)) {
self.pressed = false
}
}) {
Wedge(startAngle: .init(degrees: 270), endAngle: .init(degrees: 360))
.fill(Color.green)
.frame(width: 200, height: 200)
.offset(x: -100, y: 100)
.scaleEffect(self.pressed ? 1.2 : 1.0)
}
По сути, он меняет мою форму клина, когда я нажимаю на него, но затем ничего не делает при следующем нажатии.
Я справился с DispatchQueue
, но это похоже на хак:
Button(action: {
withAnimation(.linear(duration: 0.5)) {
self.pressed = !self.pressed
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
withAnimation(.linear(duration: 0.5)) {
self.pressed = !self.pressed
}
}
}) {
Wedge(startAngle: .init(degrees: 180), endAngle: .init(degrees: 270))
.fill(Color.red)
.frame(width: 200, height: 200)
.offset(x: 80, y: 80)
.scaleEffect(self.pressed ? 1.2 : 1.0)
}
Является ли второй способ правильным способом сделать это?
- -
Вот Клин:
struct Wedge: Shape {
let startAngle: Angle
let endAngle: Angle
func path(in rect: CGRect) -> Path {
var path = Path()
let center = CGPoint(x: rect.midX, y: rect.midY)
path.addArc(center: center,
radius: min(rect.midX, rect.midY),
startAngle: startAngle,
endAngle: endAngle,
clockwise: false )
path.addLine(to: center)
path.closeSubpath()
return path
}
}