4 动画

原文链接: https://developer.apple.com/documentation/swiftui/animations

4 动画

响应状态变化创建平滑的视觉更新。

概述

你告诉 SwiftUI 如何在不同的状态下绘制应用的用户界面,然后由 SwiftUI 在状态变化时负责更新界面。

为避免状态变化时出现突兀的视觉过渡,请用下列方式之一添加动画:

  • 在调用全局函数 withAnimation(::) 时改变状态,从而为该状态变化的所有视觉改动添加动画。
  • 给视图应用 animation(_:value:) 视图修饰符,从而在特定值变化时为该视图添加动画。
  • 使用绑定的 animation(_:) 方法,为 Binding 的变化添加动画。

SwiftUI 会为许多内置视图修饰符产生的效果添加动画,例如设置缩放或不透明度的那些修饰符。你可以让自己的自定义视图遵循 Animatable 协议,并把你想要添加动画的值告诉 SwiftUI,从而为其他值添加动画。

当某个带动画的状态变化导致视图被加入或移出视图层级时,你可以用 AnyTransition 定义的内置过渡(例如 slide 或 scale)告诉 SwiftUI 该视图如何进入或离开。你也可以创建自定义过渡。

关于设计指导,参见 Human Interface Guidelines 中的动态效果。

为动作添加基于状态的动画

为视图添加基于状态的动画

  • animation(_:) —— 当该视图变化时,对它应用给定的动画。
  • animation(_:value:) —— 当指定值变化时,对该视图应用给定的动画。
  • animation(_:body:) —— 对 body 闭包内所有可动画的值应用给定的动画。

创建基于阶段的动画

创建基于关键帧的动画

创建自定义动画

  • CustomAnimation —— 定义某个可动画值如何随时间变化的类型。
  • AnimationContext —— 自定义动画可用于管理状态并访问视图环境的上下文值。
  • AnimationState —— 为自定义动画存储状态的容器。
  • AnimationStateKey —— 访问动画状态值的键。
  • UnitCurve —— 由二维曲线定义的函数,把 [0,1] 范围内的输入进度映射到同样在 [0,1] 范围内的输出进度。改变曲线形状即可改变动画或其他插值的实际速度。
  • Spring —— 对弹簧运动的表示。

让数据可动画

按计划更新视图

同步几何信息

  • matchedGeometryEffect(id:in:properties:anchor:isSource:) —— 用你提供的标识符和命名空间定义一组几何信息同步的视图。
  • MatchedGeometryProperties —— 一组可以用 View.matchedGeometryEffect() 函数在视图之间同步的视图属性。
  • GeometryEffect —— 改变视图视觉外观的效果,基本不改变它的祖先或后代。
  • Namespace —— 允许访问某个命名空间的动态属性类型,该命名空间由包含该属性的对象(例如视图)的持久身份定义。
  • geometryGroup() —— 把视图的几何信息(例如位置和大小)与其父视图隔离。

定义过渡

定义匹配过渡

定义导航过渡

把动画移到另一个视图

  • withTransaction(::) —— 用指定的事务执行闭包并返回结果。
  • withTransaction(::_:) —— 用指定的事务键路径和值执行闭包并返回结果。
  • transaction(_:) —— 把给定的事务变更函数应用到该视图内使用的所有动画。
  • transaction(value:_:) —— 把给定的事务变更函数应用到该视图内使用的所有动画。
  • transaction(_:body:) —— 把给定的事务变更函数应用到 body 闭包内使用的所有动画。
  • Transaction —— 当前状态处理更新的上下文。
  • Entry() —— 创建环境值、事务、容器值或焦点值的条目。
  • TransactionKey —— 访问事务中值的键。

已弃用的类型