Постоянно повторяя действие в SwiftUI - PullRequest
1 голос
/ 08 июня 2019

Как я могу сделать такой элемент, как текстовое поле, увеличивать и уменьшать масштаб непрерывно?

У меня есть это:

struct ContentView : View {
    @State var size:Double = 0.5

    var body: some View { 
        ZStack {
            Text("Hello!")
                 .padding()
                 .scaleEffect(size)
        }
    }
}

Я знаю, что мне нужно увеличить размер, а затем уменьшитьэто в каком-то цикле, но следующее не может быть сделано в SwiftUI:

while true {

  self.size += 0.8
  sleep(0.2)
  self.size -= 0.8

}

Ответы [ 2 ]

2 голосов
/ 08 июня 2019

Возможным решением является использование (повторяющейся, автореверсивной) анимации:

struct ContentView : View {
    @State var size: CGFloat = 0.5

    var repeatingAnimation: Animation {
        Animation
            .basic(duration: 2)
            .repeatForever()
    }

    var body: some View {
        Text("Hello!")
            .padding()
            .scaleEffect(size)
            .onAppear() {
                withAnimation(self.repeatingAnimation) { self.size = 1.3 }
        }
    }
}
1 голос
/ 08 июня 2019

Лучший способ - создать отдельную структуру анимации и настроить все необходимые параметры (таким образом ваш код будет более компактным).

Чтобы сделать его более понятным и логичным, используйте свойство @State inProgress.Вы сможете остановить анимацию и возобновить ее снова, а также понять, когда она выполняется.

    @State private var isAnimating = false

    var foreverAnimation: Animation {
        Animation.basic(duration: 0.3)
        .repeatForever()
    }

    var body: some View {

        Text("Hello")
            .scaleEffect(isAnimating ? 1.5 : 1)
            .animation(foreverAnimation)
            .onAppear {
                self.isAnimating = true
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...