在 SwiftUI 中的作用域动画

在这里插入图片描述

在这里插入图片描述

文章目录

    • 前言
    • 简单示例
    • 动画视图修饰符
    • 使用多个可动画属性
    • 使用 ViewBuilder
    • 总结

前言

从一开始,动画就是 SwiftUI 最强大的功能之一。你可以在 SwiftUI 中快速构建流畅的动画。唯一的缺点是每当我们需要运行多步动画或将动画范围限定到视图层次结构的特定部分时,我们如何控制动画。

简单示例

让我们从一个简单的示例开始,展示我们旧方法的一些缺点,这些方法用于在 SwiftUI 中驱动动画。

struct ContentView: View {@State private var isHidden = falsevar body: some View {VStack {Button("Animate") {isHidden.toggle()}HugeView().opacity(isHidden ? 0.0 : 1.0)AnotherHugeView()}.animation(.default)}
}

如上例所示,我们有一个包含按钮和两个视图的视图层次结构,这些视图放置在垂直堆栈中。我们将动画视图修饰符附加到整个堆栈,以动画堆栈内的任何更改。

当我们按下按钮时,堆栈会动画显示内部的任何更改。但是,动画视图修饰符不连接到 isHidden 属性,这意味着它将动画显示可能发生的任何更改。其中一些更改可能是意外的,比如环境值的变化。

动画视图修饰符

我们可以通过使用动画视图修饰符的另一个版本来消除意外动画,在这个版本中,我们可以绑定到特定值,并且仅在值更改时进行动画处理。

struct ContentView: View {@State private var isHidden = falsevar body: some View {VStack {Button("Animate") {isHidden.toggle()}HugeView().opacity(isHidden ? 0.0 : 1.0)AnotherHugeView()}.animation(.default, value: isHidden)}
}

在上面的示例中,我们使用了带有 value 参数的动画视图修饰符。它允许我们将动画范围限定为单个值,并仅在与特定值相关的更改时执行动画。在这种情况下,我们没有任何意外的动画。

使用多个可动画属性

如果我们有多个可动画属性怎么办?

在这种情况下,我们必须为每个可动画属性附加一个动画修饰符。这个解决方案非常有效,但在人体工程学方面有一个缺点。

struct ContentView: View {@State private var firstStep = false@State private var secondStep = falsevar body: some View {VStack {Button("Animate") {Task {firstStep.toggle()try? await Task.sleep(nanoseconds: 3_000_000_000)secondStep.toggle()}}// 其他视图在这里SomeView().opacity(firstStep ? 1.0 : 0.0).blur(radius: secondStep ? 0 : 20.0)}.animation(.default, value: firstStep).animation(.default, value: secondStep)}
}

幸运的是,SwiftUI 引入了动画视图修饰符的一个新变体,允许我们使用 ViewBuilder 闭包来限定动画的范围。

struct ContentView: View {@State private var firstStep = false@State private var secondStep = falsevar body: some View {VStack {Button("Animate") {Task {firstStep.toggle()try? await Task.sleep(nanoseconds: 1_000_000_000)secondStep.toggle()}}// 其他视图在这里SomeView().animation(.default) { content incontent.opacity(firstStep ? 1.0 : 0.0).blur(radius: secondStep ? 0 : 20.0)}}}
}

如上例所示,我们使用动画视图修饰符,提供我们需要的动画类型和一个 ViewBuilder 闭包,在这个动画中应用。动画仅在提供的 ViewBuilder 闭包的上下文中工作,不会扩展到其他任何地方。

使用 ViewBuilder

作为起点,ViewBuilder 闭包提供一个参数,用于占位视图,在其中应用了动画视图修饰符。在 ViewBuilder 闭包内部,可以安全地对视图应用任何视图修饰符,并期望仅对此代码块进行动画处理。

struct ContentView: View {@State private var firstStep = false@State private var secondStep = falsevar body: some View {VStack {Button("Animate") {Task {firstStep.toggle()try? await Task.sleep(nanoseconds: 1_000_000_000)secondStep.toggle()}}// 其他视图在这里SomeView().transaction { t int.animation = t.animation?.speed(2)} body: { content incontent.opacity(firstStep ? 1.0 : 0.0).blur(radius: secondStep ? 0 : 20.0)}}}
}

正如你所看到的,SwiftUI 提供了一种类似的方法,以在视图层次结构中维护有作用域的事务。

总结

这篇文章介绍了在SwiftUI中构建动画的新方法,重点解决了在多步动画或特定视图层次结构中控制动画的挑战。通过引入带有value参数的动画修饰符,以及使用ViewBuilder闭包限定动画范围,作者展示了更精确和灵活的动画控制方式。

这种方法在处理多个可动画属性时尤其强大。文章还提到了SwiftUI引入的一项新变体,使用ViewBuilder闭包可在动画中应用视图修饰符,有效地将动画范围限定在特定的上下文中。

最后,介绍了在 SwiftUI 中构建有作用域的事务的新方法,以维护更具精确性和可控性的动画。这些新功能在最新的平台上可用,为SwiftUI开发者提供了更强大的动画工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker emqx 配置密码和禁用匿名连接

mqtt版本emqx/emqx:4.4.3 1.首先把镜像内目录/opt/emqx/etc拷贝到本地 2.做映射 3.allow_anonymous, false改成true 4. 5.MQTTX连不上的话看看下图的有没有打开

【nginx】nginx的优点

目录 一、高性能1.1 高并发处理1.2 低内存消耗1.3 快速响应 二、高扩展性2.1 模块化设计2.2 动态模块扩展 三、高可靠性3.1 核心框架稳定3.2 进程管理3.3 负载均衡与健康检查3.4 热部署 四、功能丰富4.1 反向代理4.2 HTTP缓存4.3 安全功能 五、易于配置和管理5.1 配置文件简单5…

windows下环境变量开启方式

第一种方法: 使用快捷键打开“运行”对话框:按下 Win R 组合键,这将打开“运行”窗口。 输入系统属性命令:在“运行”窗口中输入 sysdm.cpl 然后按回车键。这将打开“系统属性”对话框。【sysdm.cpl是"System Data Manager…

【Go系列】Go的指针

承上启下 我们在前面的文章中,首先介绍了GO的基础语法,然后介绍了Goroutine和channel这个最具有特色的东西,同时介绍了Sync和context,以及在上篇文章中详细距离说明了Go里面用于高并发的多种写法。基础的使用方法也告一段落了&…

Linux多线程编程-哲学家就餐问题详解与实现(C语言)

在哲学家就餐问题中,假设有五位哲学家围坐在圆桌前,每位哲学家需要进行思考和进餐两种活动。他们的思考不需要任何资源,但进餐需要使用两根筷子(左右两侧各一根)。筷子是共享资源,哲学家们在进行进餐时需要…

Qt qml详细介绍

一.基本类型 QML的基本类型包括了很多不同的类型,这些类型可以用于定义用户界面元素、属性和信号。以下是一些常用的QML基本类型及其详细介绍: 数值类型:包括整数类型(int、uint、short、ushort等)和浮点数类型&#…

c++ :运算符重载函数中的细节

赋值运算符重载与拷贝构造函数 (1)区分初始化时的赋值(一般就叫初始化),和非初始化时的赋值(一般就叫赋值) (2)实验验证初始化和赋值时各自对应 避免赋值运算符中的自赋值 (1)自赋值就是Person a; a a; (2)自赋值如…

鞭炮插画:成都亚恒丰创教育科技有限公司

鞭炮插画:年味里的绚烂记忆 在岁末年初的温柔时光里,总有一抹色彩,能瞬间唤醒沉睡的年味——那便是鞭炮插画中跃动的红与金,成都亚恒丰创教育科技有限公司 它们不仅仅是纸与墨的交织,更是情感与记忆的桥梁&#xff0c…

自适应手机版大学职业技术学院网站模版源码系统 带完整的安装代码包以及搭建部署教程

系统概述 随着智能手机的普及和移动互联网技术的飞速发展,用户越来越倾向于通过移动设备访问网站。对于大学职业技术学院而言,一个能够自适应各种屏幕尺寸、操作流畅、内容丰富的移动端网站,不仅能够提升用户体验,还能有效扩大学…

最短路之朴素版的dij板子

模板&#xff1a; 注意这个只是单向的双向的需要在更新一次 #include<bits/stdc.h>using namespace std;typedef long long ll; typedef pair<int, int>PII; const int N2e510; const int MOD 998244353; const int INF0X3F3F3F3F; const int dx[]{-1,1,0,0,-1,…

【Python Tips】将一个列表List元素添加进另一个列表List

一、引言 在处理Python列表数据类型时&#xff0c;有时需要合并两个列表&#xff0c;下面是几种列表合并的操作代码&#xff0c;尤其是对于长列表的高效合并方式&#xff0c;记录在此。 二、列表合并方式 1. 使用extend方法 extend方法将一个列表中的所有元素添加到另一个列表…

mysql快速精通(三)表关系

主打一个实用 一. 一对多&#xff08;多对一&#xff09;关系 例如班级和学生&#xff0c;这种类型我们一般建两个表,一方为主表&#xff0c;多方为从表 二. 多对多 例如课程与学生&#xff0c;这种类型我们一般需要建三张表&#xff0c;两张一方主表&#xff0c;与一张多方从表…

初识影刀:EXCEL根据部门筛选低值易耗品

第一次知道这个办公自动化的软件还是在招聘网站上&#xff0c;了解之后发现对于办公中重复性的工作还是挺有帮助的&#xff0c;特别是那些操作非EXCEL的重复性工作&#xff0c;当然用在EXCEL上更加方便&#xff0c;有些操作比写VBA便捷。 下面就是一个了解基本操作后&#xff…

[Linux]CentOS软件的安装

一、Linux 软件包管理器 yum 1.Linux安装软件的方式 在linux中安装软件常用的有三种方式&#xff1a; 源代码安装&#xff08;我们还需要进行编译运行后才可以&#xff0c;很麻烦&#xff09; rpm安装&#xff08;Linux的安装包&#xff0c;需要下载一些rpm包&#xff0c;但是…

基于机器学习的锂离子电池容量估计(MATLAB R2021B)

锂离子电池已经广泛应用于电动汽车或混合动力汽车的能源存储装置。由于电化学成分的衰退&#xff0c;锂离子电池随着使用时间的增加&#xff0c;电池性能不断退化&#xff0c;导致电池容量和功率发生衰退。电池容量衰退的因素主要有金属锂沉积&#xff0c;活性物质分解和电解液…

深度学习DeepLearning多元线性回归 学习笔记

文章目录 多维特征变量与术语公式多元线性回归正规方程法Mean normalizationZ-score normalization设置合适的学习率Feature engineering 多维特征 变量与术语 列属性xj属性数n x ⃗ \vec{x} x (i)行向量某个值 x ⃗ j i \vec{x}_j^i x ji​上行下列均值μ标准化标准差σsigm…

SpringMVC 中常用注解

在 SpringMVC 框架的开发中&#xff0c;注解的合理运用能够极大地提高开发效率和代码的可维护性。今天&#xff0c;让我们一起来总结一下 SpringMVC 中一些常用的注解及其用法。 一、Controller 注解 Controller 用于标识一个控制器类&#xff0c;该类中的方法用于处理用户的请…

ArduPilot开源代码之AP_AHRS_Backend

ArduPilot开源代码之AP_AHRS_Backend 1. 源由2. 类继承关系3. 框架设计2.1 构造函数和析构函数2.2 不可复制2.3 嵌套结构和枚举2.4 虚方法2.5 静态方法2.6 实用方法2.7 纯虚方法2.8 条件编译 3. 虚方法设计3.1 初始化3.1.1 构造函数3.1.2 析构函数3.1.3 AP_AHRS_Backend::init …

Chromium CI/CD 之Jenkins实用指南2024-如何创建新节点(三)

1. 前言 在前一篇《Jenkins实用指南2024-系统基本配置&#xff08;二&#xff09;》中&#xff0c;我们详细介绍了如何对Jenkins进行基本配置&#xff0c;包括系统设置、安全配置、插件管理以及创建第一个Job。通过这些配置&#xff0c;您的Jenkins环境已经具备了基本的功能和…

基于pyqt5实现xlsx选择器应用程序

环境搭建 基于python3.12pyqt5 pip3 install PyQt5 pip3 install pyinstallerpyinstaller --onefile --windowed test.py代码 新建main.py import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QFileDial…