SwiftUI 动画进阶 — Part4:TimelineView

2022-04-04 15:32:36 浏览数 (1)

前言

前三篇高级 SwiftUI 动画系列是作者在 WWDC 2021 之前实战总结的内容。对 2021 年 WWDC 介绍的 TimelineViewCanvas 感到激动。这开启了一个全新的可能性,笔者将试图在这一部分和下一部分的系列中阐释这些可能性。

在这篇文章中,我们将详细地探索 TimelineView 。我们将从最常见的用途缓慢开始。然而笔者认为,最大的可能性来自于 TimelineView 和我们已知现有的动画相结合。在其他事物中,通过一点创意,这样的组合将让我们最终实现“关键帧类似”的动画。

在第 5 部分,我们将探索 Canvas 视图,以及它和我们的新朋友 TimelineView 相结合是如此的优秀。

上文中展示的动画,是使用本文中介绍的技术创建的。该动画的完整代码可在此 gist 中找到。

TimelineView 的组件

TimelineView 是一个容器视图,它以相关调度程序确定的频率重新评估其内容:

代码语言:javascript复制
TimelineView(.periodic(from: .now, by: 0.5)) { timeline in

    ViewToEvaluatePeriodically()

}

TimelineView 接收调度程序作为参数。稍后我们将详细认识它们,现在,上述示例使用每半秒触发一次的调度程序。

另一个参数是一个内容闭包,它接收一个看起来像这样的 TimelineView.Context 参数:

代码语言:javascript复制
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 = ["


	

0 人点赞