SwiftUI疑难杂症(2):ZStack子视图transition动画问题

最近有个群友询问自己的ZStack动画效果有问题。于是帮其进行了分析,最终解决了问题。

在 SwiftUI 中,最简单、最快捷的方法之一是使用条件 ZStack。然而,在尝试制作 in-out 过渡的动画时,in 动画效果很好,但 out 动画效果不佳。让我们检查一下问题,然后找到解决方案。

以下面的代码为例:

struct ContentView: View {
    
    //State that stores the blue rectangle show state
    @State var showBlue = false
    
    var body: some View {
        ZStack{
            
            //Green rectangle
            Rectangle()
                .frame(width: 200, height: 200)
                .foregroundColor(.green)
            
            //Blue rectangle - Conditional!
            if showBlue{
                Rectangle()
                    .frame(width: 200, height: 200)
                    .foregroundColor(.blue)
                    .transition(.opacity)
            }
            
            //Button that shows/hides the blue rectangle
            Button("showBlue") {
                withAnimation{
                    showBlue.toggle()
                }
            }.foregroundColor(.white)
        }
    }
}

让我们尝试运行该应用程序。如果按下 showBlue 按钮,您将看到蓝色矩形将显示为动画并且效果很好。但是如果你再次切换它,蓝色矩形就会消失,没有任何动画。什么原因会导致此问题?

问题在于 ZStack。每次 showBlue 状态更改时,SwiftUI 都会重新渲染 ContentView 结构体。当将其设置为 true 时,它会重新渲染视图,添加蓝色矩形,然后动画将发生。当再次按下按钮时,也会发生同样的情况。showBlue 将更改为 false,ContentView 视图结构将重新渲染,现在没有蓝色矩形。不过,动画应该开始,并且不透明度应该降低到 0。问题是,第二次重新渲染视图时,ZStack 会以不合适的方式发生变化。蓝色的矩形将从 ZStack 中取出,被按钮所替换。zIndex 定义视图在 ZStack 中如何相互对齐。zIndex 在 ZStack 中自动计算。例如,如果蓝色矩形可见,则绿色将变为 1,蓝色变为 2,按钮将变为 3。索引越大,视图越靠前。所以蓝色矩形在绿色矩形的上方,绿色矩形在蓝色矩形的后面。该按钮位于蓝色矩形上方,依此类推......当视图重新呈现时,按钮的 zIndex 将从 3 更改为 2。它替换了蓝色的矩形(以前有 zIndex 2),因此动画无法正常发生。

要解决此问题,需要做的就是手动指定 zIndex。如果这样做,则按钮将保持在 zIndex 3 处,因此它不会替换蓝色的矩形。这样,也可以发生过渡出动画。让我们尝试实现修复:

struct ContentView: View {
    
    //State that stores the blue rectangle show state
    @State var showBlue = false
    
    var body: some View {
        ZStack{
            
            //Green rectangle
            Rectangle()
                .frame(width: 200, height: 200)
                .foregroundColor(.green)
                .zIndex(1)
            
            //Blue rectangle - Conditional!
            if showBlue{
                Rectangle()
                    .frame(width: 200, height: 200)
                    .foregroundColor(.blue)
                    .transition(.opacity)
                    .zIndex(2)
            }
            
            //Button that shows/hides the blue rectangle
            Button("showBlue") {
                withAnimation{
                    showBlue.toggle()
                }
            }.foregroundColor(.white)
            .zIndex(3)
        }
    }
}

现在运行动画,它将正常工作。我希望本教程能帮助您理解和解决 ZStack 中的过渡动画相关问题。

参考

SwiftUI — How to solve transition animation problems in ZStack

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware和CentOS 7.6 Linux操作系统的安装使用

1. 安装VMware 安装VMware之前,有些电脑是需要去BIOS里修改设置开启cpu虚拟化设备支持才能安装。如果运气不好在安装过程中安装不了的话就自行百度吧。 打开 VMware 的官网: https://www.vmware.com/ 点击 product,往下滑找到 see desktop hypeerviso…

手把手教你:如何从零开始实施一套OA办公系统!

很多朋友都吐槽说公司的各种各样的信息啊文件啊越积越多,导致管理起来越来越麻烦。早就跟大家说过,尤其是在提高工作效率、优化资源配置和促进信息共享方面,OA(办公自动化)系统发挥着不可替代的作用,早安排…

网页web无插件播放器EasyPlayer.js播放器返回错误 Incorrect response MIME type 的解决方式

在使用EasyPlayer.js播放器进行视频流播放时,尤其是在SpringBoot环境中部署静态资源时,可能会遇到“Incorrect response MIME type”的错误,这通常与WebAssembly(WASM)文件的MIME类型配置有关。 WASM是一种新的代码格式…

element-plus <el-date-picker>日期选择器踩坑!!!!

我怎么一上午踩两个坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;大声bb&#xff09; 原来的vue2老项目是这样写的 <el-form-item label"时间" prop"time"><el-date-pickerv-model"addForm.time"typ…

# 如何查看 Ubuntu 版本?

如何查看 Ubuntu 版本&#xff1f; 要查看‌Ubuntu版本&#xff0c;你可以通过以下几种方法&#xff1a; 1. 使用‌lsb_release 命令‌查看 使用 lsb_release -a 命令可以查看Ubuntu的详细版本信息&#xff0c;包括发行版ID、版本号以及版本代号。‌ ‌### 2、查看 /etc/is…

常用的生物医药专利查询数据库及网站(很全!)

生物医药专利信息检索是药物研发前期不可或缺的一步&#xff0c;通过对国内外生物医药专利网站信息查询&#xff0c;可详细了解其专利技术&#xff0c;进而有效降低药物研发过程中的风险。 目前主要使用的生物医药专利查询网站分为两大类&#xff0c;一个是免费生物医药专利查询…

第四节-OSI-网络层

数据链路层&#xff1a;二层--MAC地址精确定位 Ethernet 2&#xff1a; 报头长度&#xff1a;18B 携带的参数&#xff1a;D MAC /S MAC/TYPE(标识上层协议)/FCS 802.3 报头长度&#xff1a;26B 携带的参数&#xff1a;D MAC/S MAC/LLC(标识上层协议)/SNAP&#xff08;标识…

Python数据分析NumPy和pandas(二十七、数据可视化 matplotlib API 入门)

数据可视化或者数据绘图是数据分析中最重要的任务之一&#xff0c;是数据探索过程的一部分&#xff0c;数据可视化可以帮助我们识别异常值、识别出需要的数据转换以及为模型生成提供思考依据。对于Web开发人员&#xff0c;构建基于Web的数据可视化显示也是一种重要的方式。Pyth…

【前端】深入浅出 - TypeScript 的详细讲解

TypeScript 是一种静态类型编程语言&#xff0c;它是 JavaScript 的超集&#xff0c;添加了类型系统和编译时检查。TypeScript 的主要目标是提高大型项目的开发效率和可维护性。本文将详细介绍 TypeScript 的核心概念、语法、类型系统、高级特性以及最佳实践。 1. TypeScript…

查询DBA_FREE_SPACE缓慢问题

这个是一个常见的问题&#xff0c;理论上应该也算是一个bug&#xff0c;在oracle10g&#xff0c;到19c&#xff0c;我都曾经遇到过&#xff1b;今天在给两套新建的19C RAC添加监控脚本时&#xff0c;又发现了这个问题&#xff0c;在这里记录一下。 Symptoms 环境&#xff1a;…

The Internals of PostgreSQL 翻译版 持续更新...

为了方便自己快速学习&#xff0c;整理了翻译版本&#xff0c;目前翻译的还不完善&#xff0c;后续会边学习边完善。 文档用于自己快速参考&#xff0c;会持续修正&#xff0c;能力有限,无法确保正确!!! 《The Internals of PostgreSQL 》 不是 《 PostgreSQL14 Internals 》…

机器学习 ---模型评估、选择与验证(1)

目录 前言 一、为什么要有训练集与测试集 1、为什么要有训练集与测试集 2、如何划分训练集与测试集 二、欠拟合与过拟合 1、什么是欠拟合与欠拟合的原因 2、什么是过拟合与过拟合的原因 一些解决模型过拟合和欠拟合问题的常见方法&#xff1a; 解决过拟合问题&#…

一文简单了解Android中的input流程

在 Android 中&#xff0c;输入事件&#xff08;例如触摸、按键&#xff09;从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次&#xff0c;包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程&#xff0c;并结合代码逐步了解…

【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题

目录 1. 单例模式 (1) 饿汉模式 (2) 懒汉模式 1. 单线程版本 2. 多线程版本 2. 解决懒汉模式产生的线程安全问题 (1) 产生线程安全的原因 (2) 解决线程安全问题 1. 通过加锁让读写操作紧密执行 方法一 方法二 2. 处理加锁引入的新问题 问题描述 …

二叉树搜索树(下)

二叉树搜索树&#xff08;下&#xff09; 二叉搜索树key和key/value使用场景 key搜索场景 只有key作为关键码&#xff0c;结构中只需要存储key即可&#xff0c;关键码即为需要搜索到的值&#xff0c;搜索场景只需要判断 key在不在。key的搜索场景实现的二叉树搜索树支持增删查…

Web项目版本更新及时通知

背景 单页应用&#xff0c;项目更新时&#xff0c;部分用户会出更新不及时&#xff0c;导致异常的问题。 技术方案 给出版本号&#xff0c;项目每次更新时通知用户&#xff0c;版本已经更新需要刷新页面。 版本号更新方案版本号变更后通知用户哪些用户需要通知&#xff1f;…

D64【python 接口自动化学习】- python基础之数据库

day64 SQL-DQL-基础查询 学习日期&#xff1a;20241110 学习目标&#xff1a;MySQL数据库-- 133 SQL-DQL-基础查询 学习笔记&#xff1a; 基础数据查询 基础数据查询-过滤 总结 基础查询的语法&#xff1a;select 字段列表|* from 表过滤查询的语法&#xff1a;select 字段…

Unity插件-Smart Inspector 免费的,接近虚幻引擎的蓝图Tab管理

习惯了虚幻的一张蓝图&#xff0c;关联所有Tab &#xff08;才发现Unity&#xff0c;的Component一直被人吐槽&#xff0c;但实际上是&#xff1a;本身结构Unity 的GameObject-Comp结构&#xff0c;是好的不能再好了&#xff0c;只是配上 smart Inspector就更清晰了&#xff0…

2024 年Postman 如何安装汉化中文版?

2024 年 Postman 的汉化中文版安装教程

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法&#xff1a; 注意事项&#xff1a; 2.集成测试 需注意事项&#xff1a; 实现集成测试的方法&#xff1a; 如何实现高效且可靠的集成测试&#xff1a; 3.系统测试 实现系统测试的方法: 须知注意事项&#xff1a; 4.验收测试 实现验…