SwiftUI 教程

SwiftUI - 主页 SwiftUI - 概览 SwiftUI 与 UIkit

SwiftUI 环境

SwiftUI - 环境设置 SwiftUI - 基本组件 SwiftUI - 构建第一个应用程序

SwiftUI 视图

SwiftUI - 视图 SwiftUI - 自定义文本视图 SwiftUI - 自定义图像视图 SwiftUI - 堆栈

SwiftUI 绘制形状

SwiftUI - 形状 SwiftUI - 绘制线条 SwiftUI - 绘制矩形 SwiftUI - 绘制圆角矩形 SwiftUI - 绘制三角形 SwiftUI - 绘制圆形 SwiftUI - 绘制星形 SwiftUI - 绘制多边形 SwiftUI - 绘制饼图 SwiftUI - 使用内置形状

SwiftUI - 文本

SwiftUI - 文本视图 SwiftUI - 文本输入和输出

SwiftUI - 颜色

SwiftUI - 颜色 SwiftUI - 颜色选择器 SwiftUI - 渐变 SwiftUI - 调整颜色

SwiftUI - 效果

SwiftUI - 效果 SwiftUI - 混合效果 SwiftUI - BLur 效果 SwiftUI - 阴影效果 SwiftUI - 悬停效果

SwiftUI - 动画

SwiftUI - 动画 SwiftUI - 创建动画 SwiftUI - 创建显式动画 SwiftUI - 多个动画 SwiftUI - 过渡 SwiftUI - 不对称过渡 SwiftUI - 自定义过渡

SwiftUI - 图像

SwiftUI - 图像 SwiftUI - 图像作为背景 SwiftUI - 旋转图像 SwiftUI - 媒体

SwiftUI - 视图布局

SwiftUI - 视图布局 SwiftUI - 视图大小 SwiftUI - 视图间距 SwiftUI - 视图填充

SwiftUI - UI 控件

SwiftUI - UI 控件 SwiftUI - 按钮 SwiftUI - 复选框 SwiftUI - 菜单栏 SwiftUI - 工具栏 SwiftUI - 搜索栏 SwiftUI - 文本字段 SwiftUI - 滑块 SwiftUI - 切换 SwiftUI - 选择器 SwiftUI - 菜单

SwiftUI - 列表 &表格

SwiftUI - 列表 SwiftUI - 静态列表 SwiftUI - 动态列表 SwiftUI - 自定义列表 SwiftUI - 表格

SwiftUI - 表单

SwiftUI - 表单 SwiftUI - 在部分中拆分表单

SwiftUI - 事件处理

SwiftUI - 事件处理 SwiftUI - 手势 SwiftUI - 剪贴板 SwiftUI - 拖放 SwiftUI - 焦点 SwiftUI - 警报

SwiftUI - 杂项

SwiftUI - 容器 SwiftUI - 导航 SwiftUI - 通知 SwiftUI - 跨平台 UI SwiftUI - 数据 SwiftUI - 可访问性

SwiftUI - 框架集成

SwiftUI - 框架集成 SwiftUI - 与 UIKit 交互 SwiftUI - 创建 macOS 应用

SwiftUI 有用资源

SwiftUI - 有用资源 SwiftUI - 讨论


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()
}

输出

多重动画

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()
}

输出

多重动画

在 SwiftUI 中为多个视图设置动画

在 SwiftUI 中,我们可以借助 .animtion() 和 .withAnimation() 修饰符同时为多个视图设置动画。我们可以对视图使用相同的状态更改变量或不同的变量。现在让我们通过以下示例讨论如何为多个视图设置动画。

示例

以下 SwiftUI 程序为两个视图设置动画,即矩形视图和文本视图。这里两个视图都使用相同的状态更改变量,并且这些状态由 .withAnimation() 修饰符控制。缩放效果应用于矩形视图,旋转效果应用于文本视图。

import SwiftUI

struct ContentView: View {
   @State private var myState = false    
   var body: some View {
      ZStack{
         // 动画矩形视图
         Rectangle().fill(.yellow).frame(width: 150, height: 50)
         // 这里我们对矩形应用缩放效果
         .scaleEffect(myState ? 0.8 : 2)
            
         // 动画文本视图
         Text("TutorialsPoint").font(.largeTitle).foregroundStyle(.green)
         // 这里我们对文本应用旋转效果
         .rotationEffect(.degrees(myState ? 360 : 0))
        }.padding(30)
       
        Button("Click Me"){
           withAnimation(.easeInOut(duration: 1.4)){
                myState.toggle()
            }
        }.font(.title)
    }
}

#Preview {
   ContentView()
}

输出

多个动画