前言
前三篇高级 SwiftUI 动画系列是作者在 WWDC 2021 之前实战总结的内容。对 2021 年 WWDC 介绍的 TimelineView
和 Canvas
感到激动。这开启了一个全新的可能性,笔者将试图在这一部分和下一部分的系列中阐释这些可能性。
在这篇文章中,我们将详细地探索 TimelineView
。我们将从最常见的用途缓慢开始。然而笔者认为,最大的可能性来自于 TimelineView
和我们已知现有的动画相结合。在其他事物中,通过一点创意,这样的组合将让我们最终实现“关键帧类似”的动画。
在第 5 部分,我们将探索 Canvas
视图,以及它和我们的新朋友 TimelineView
相结合是如此的优秀。
上文中展示的动画,是使用本文中介绍的技术创建的。该动画的完整代码可在此 gist 中找到。
TimelineView 的组件
TimelineView
是一个容器视图,它以相关调度程序确定的频率重新评估其内容:
TimelineView(.periodic(from: .now, by: 0.5)) { timeline in
ViewToEvaluatePeriodically()
}
TimelineView
接收调度程序作为参数。稍后我们将详细认识它们,现在,上述示例使用每半秒触发一次的调度程序。
另一个参数是一个内容闭包,它接收一个看起来像这样的 TimelineView.Context
参数:
struct Context {
let cadence: Cadence
let date: Date
enum Cadence: Comparable {
case live
case seconds
case minutes
}
}
Cadence
是一个枚举类型,我们可以使用它来决定在我们的视图中显示什么。可能的值是:live、seconds 和 minutes。以此为提示,避免显示与 Cadence
无关的信息。典型的例子,是避免在具有秒或分钟节奏的调度程序的时钟上显示毫秒。
请注意,Cadence
不是你可以更改的东西,而是反映设备状态的东西。文档仅提供了一个例子。在 watchOS 上,降低手腕时 Cadence
会减慢。如果你发现了 Cadence
发生变化的其他情况,笔者非常想知道。请在下方发表评论。
好吧,这一切看起来都很棒,但是我们应该注意许多微妙之处。让我们开始构建我们的第一个 TimelineView
动画,看看它们是什么。
理解 TimelineView 如何工作
观察下面的代码。我们有两个随机变化的表情符号。两者之间的唯一区别是,一个写在内容闭包中,而另一个被放在单独的视图中以提高可读性。
代码语言:javascript复制struct ManyFaces: View {
static let emoji = ["