SwiftUI, как сделать цвет фона многократно анимированным - PullRequest
0 голосов
/ 12 июля 2020

У меня есть проект SwiftUI, который включает объект Text с работающим .onTapGesture, который при срабатывании должен вызывать смену цвета фона кнопки на другой цвет, а затем быстрое исчезновение до исходного цвета. В моем коде я могу вызвать всплеск цвета, но он остается таким и не исчезает. Я как бы не понимаю, что делать, любая помощь приветствуется ... вот код, который я использую:

@State var buttonFlash = false


var body: some View {
    Text("Hello")
        .font(.system(size: 20))
        .frame(width: 30, height: 30)
        .foregroundColor(Color.blue)
        .background(buttonFlash ? Color.white : Color.red)
        .animation(nil)
        .background(Color.red)
        .animation((Animation.linear).delay(0.1))
        .cornerRadius(30)
        .onTapGesture {
            print("Tapped!")
            self.buttonFlash.toggle()

        }

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Если вы пытаетесь запустить sh backgroundColor несколько раз. Используйте метод и l oop до тех пор, пока не будет выполнено условие. Вот пример:

struct ContentView: View {

    @State private var buttonFlash: Bool = false
    @State private var numberOfTimes = 6

    var body: some View {
        Text("Hello")
            .font(.system(size: 20))
            .frame(width: 300, height: 50)
            .foregroundColor(Color.blue)
            .background(buttonFlash ? Color.white : Color.red)
            .animation(nil)
            .background(Color.red)
            .animation((Animation.linear).delay(0.1))
            .cornerRadius(30)
            .onTapGesture {
                print("Tapped!")
                self.animate()
            }
    }

    private func animate() {
        self.buttonFlash.toggle()
        if numberOfTimes > 0 {
            numberOfTimes -= 1
        } else {
            numberOfTimes = 6
            return
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
            self.animate()
        })
    }
}
0 голосов
/ 12 июля 2020

должен привести к тому, что цвет фона кнопки изменится на другой, а затем быстро исчезнет до исходного цвета.

Для этого вам необходимо объявить функцию. Вот возможный подход для этого:

struct ContentView: View {
    
    @State var buttonFlash: Bool = false
    
    var body: some View {
        Text("Hello")
            .font(.system(size: 20))
            .frame(width: 100, height: 50)
            .foregroundColor(Color.blue)
            .background(buttonFlash ? Color.white : Color.red)
            .cornerRadius(30)
            .onTapGesture {
                print("Tapped!")
                self.colorChange()
            }
    }
    
    private func colorChange() {
        // first toggle makes it red
        self.buttonFlash.toggle()
        
        // wait for 1 second
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
            // Back to normal with ease animation
            withAnimation(.easeIn){
                self.buttonFlash.toggle()
            }
        })
    }
}

Он вызывает метод после нажатия. Затем это вызывает изменение цвета и меняет его на противоположное через 1 секунду.

Производит такой результат:

введите описание изображения здесь

...