SwiftUI - 多动画使用



在 SwiftUI 中,我们可以同时对视图的多个属性(例如缩放、不透明度、旋转等)进行动画处理。在这里,我们将多个状态更改(用于多个属性)包装在同一个修饰符中,无论是 `.withAnimation()` 还是 `.animation()`。这两个修饰符都可以与单个或多个动画一起使用。使用这些多个动画,我们还可以为所有类型的视图创建各种效果。

SwiftUI 中的多个隐式动画

我们可以通过对每个属性使用 `.animation()` 修饰符来隐式地为多个属性设置动画。当属性更改状态时,它会对指定的属性进行动画处理。

示例

在下面的程序中,我们将两种隐式类型的动画应用于椭圆。因此,当我们单击按钮时,椭圆会同时开始增大尺寸并旋转。

import SwiftUI

struct ContentView: View {
   @State private var scale = false
   @State private var rotate = false
    
   var body: some View {
      VStack{
        Ellipse()
            .fill(.orange)
            .frame(width: 100, height: 110)
            .rotationEffect(.degrees(rotate ? 260 : 0))
            .scaleEffect(scale ? 3 : 1)
            .animation(.easeInOut(duration: 1), value: scale)
            .animation(.easeIn(duration: 1), value: rotate)
        
          Button("Click Me"){
             scale.toggle()
             rotate.toggle()
            }.font(.title2)
        }
    }
}
#Preview {
   ContentView()
}

输出

Multiple Animation

SwiftUI 中的多个显式动画

我们可以通过使用 `.withAnimation()` 修饰符来显式地为多个属性设置动画,其中此修饰符的闭包包含指定属性的所有状态更改。

示例

在下面的程序中,我们使用两种不同的动画(旋转和移动)对文本“TutorialsPoint”进行动画处理。在这里,当我们单击按钮时,文本向右移动,1 秒后开始旋转。

import SwiftUI
struct ContentView: View {
   @State private var move = false
   @State private var rotate = false
      
   var body: some View {
      VStack{
         Text("TutorialsPoint")
             .font(.headline)
             .foregroundStyle(.red)
             .bold()
             .rotationEffect(.degrees(rotate ? 260 : 0))
             .offset(x: move ? 150 : 0)
                  
         Button("Click Me"){
            withAnimation(.easeIn(duration: 1)){
               move.toggle()
         }
         withAnimation(.easeOut(duration:1).delay(0.5)){
            rotate.toggle()
            }
         }.font(.title2)
      }
   }
}
#Preview {
   ContentView()
}

输出

Multiple Animation

SwiftUI 中多个视图的动画

在 SwiftUI 中,我们可以使用 `.animation()` 和 `.withAnimation()` 修饰符同时对多个视图进行动画处理。我们可以对视图使用相同的 state 变量或不同的变量。现在让我们讨论如何通过以下示例来为多个视图设置动画。

示例

下面的 SwiftUI 程序对两个视图进行动画处理:矩形视图和文本视图。这里,两个视图都使用相同的 state 变量,这些状态由 `.withAnimation()` 修饰符控制。缩放效果应用于矩形视图,旋转效果应用于文本视图。

import SwiftUI

struct ContentView: View {
   @State private var myState = false    
   var body: some View {
      ZStack{
         // Animating rectangle view
         Rectangle().fill(.yellow).frame(width: 150, height: 50)
         // Here we apply scaling effect on the rectangle
         .scaleEffect(myState ? 0.8 : 2)
            
         // Animating Text View
         Text("TutorialsPoint").font(.largeTitle).foregroundStyle(.green)
         // Here we apply rotation effect on the text
         .rotationEffect(.degrees(myState ? 360 : 0))
        }.padding(30)
       
        Button("Click Me"){
           withAnimation(.easeInOut(duration: 1.4)){
                myState.toggle()
            }
        }.font(.title)
    }
}

#Preview {
   ContentView()
}

输出

Multiple Animations
广告