在 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.pswp.cn/web/45301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45301.shtml
英文地址,請注明出處:http://en.pswp.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…