在 SwiftUI 中连续重复操作

Isa*_*aac 7 swift swiftui

如何使诸如文本字段之类的元素连续放大然后缩小?

我有这个:

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

    var body: some View { 
        ZStack {
            Text("Hello!")
                 .padding()
                 .scaleEffect(size)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我需要增加大小,然后在某种循环中减少它,但在 SwiftUI 中无法完成以下操作:

while true {

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

}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 12

一种可能的解决方案是使用(重复、自动反转)动画:

struct ContentView : View {
    @State var size: CGFloat = 0.5
    
    var repeatingAnimation: Animation {
        Animation
            .easeInOut(duration: 2) //.easeIn, .easyOut, .linear, etc...
            .repeatForever()
    }

    var body: some View {
        Text("Hello!")
            .padding()
            .scaleEffect(size)
            .onAppear() {
                withAnimation(self.repeatingAnimation) { self.size = 1.3 }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


PaF*_*aFi 9

Animation.basic 已弃用。基本动画现在以其曲线类型命名:如线性等:

var foreverAnimation: Animation {
        Animation.linear(duration: 0.3)
        .repeatForever()
 }
Run Code Online (Sandbox Code Playgroud)

来源:https : //forums.swift.org/t/swiftui-animation-basic-duration-curve-deprecated/27076


Den*_*Fav 7

最好的方法是创建单独的动画结构并配置您需要的所有选项(这样您的代码将更加紧凑)。

为了使其更加清晰和合乎逻辑,请使用 @State 属性isAnimating。您将能够停止动画并再次恢复并了解动画何时进行。

    @State private var isAnimating = false

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

    var body: some View {

        Text("Hello")
            .scaleEffect(isAnimating ? 1.5 : 1)
            .animation(foreverAnimation)
            .onAppear {
                self.isAnimating = true
        }
}
Run Code Online (Sandbox Code Playgroud)