Анимация работает с первого раза, но потом - PullRequest
0 голосов
/ 23 марта 2020

Попытка анимировать 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
    }
}

1 Ответ

1 голос
/ 23 марта 2020

Возможно, вы хотели это

Button(action: {
    withAnimation(.linear(duration: 3)){
      self.pressed.toggle()               // << here !!
    }
    print("B")
    }) {
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...