visionOS空间计算实战开发教程Day 11 标题动画

本文我们要在visionOS内实现一个标题输出的动画效果。主要讲​​ViewModifier​​​协议,修饰符(modifier)应用于视图或另一个视图修饰符,生成原值的另一个版本。在希望创建一个可应用于不同视图的修饰符时可实现​​ViewModifier​​协议。

首先定义​​ViewModel​​,本例中的模型比较简单,仅定了三个变量,分别表示当前文本、标题输出是否完成以及最终的标题文本。

import SwiftUI@Observable
class ViewModel {var titleText: String = ""var isTitleFinished: Bool = falsevar finalTitle: String = "第三回 托内兄如海荐西宾 接外孙贾母惜孤女"
}

因模型中有默认值且需要在程序运行的过程中进行修改,所以在入口文件中需要将模型注入到环境中:

import SwiftUI@main
struct visionOSDemoApp: App {@State private var model = ViewModel()var body: some Scene {WindowGroup() {ContentView().environment(model)}}
}

接下来就是本文的重点了,我们需要自定义一个文本修饰符。虽然可以直接将修饰符应用于视图,但更常见和地道的做法是使用修饰符来定义一个​​View​​来包装这个视图修饰符。我们在代码里就是这么做的,在视图中我们传入了5个变量,​​text​​和​​isFinished​​是需要进行修改的,所以使用了​​Binding​​,​​cursor​​定义了光标,默认使用了常见的​​|​​,​​isAnimated​​表示是否显示动画。

在​​TypeTextModifier​​中可以看到,如果​​isAnimated​​为​​false​​,就直接显示最终文本。而在任务中有两个​​for​​循环,分别设置初始的光标闪烁效果以及后续逐个文字和光标交替输出的效果,最后等待片刻,标记输出结束。

import SwiftUIextension View {func typeText(text: Binding<String>,finalText: String,isFinished: Binding<Bool>,curor: String = "|",isAnimated: Bool = true) -> some View {self.modifier(TypeTextModifier(text: text,finalText: finalText,isFinished: isFinished,cursor: curor,isAnimated: isAnimated))}
}private struct TypeTextModifier: ViewModifier {@Binding var text: Stringvar finalText: String@Binding var isFinished: Boolvar cursor: Stringvar isAnimated: Boolfunc body(content: Content) -> some View {content.onAppear {if isAnimated == false {text = finalTextisFinished = true}}.task {guard isAnimated else { return }// Blink the cursor a few timesfor _ in 1...2 {text = cursortry? await Task.sleep(for: .milliseconds(500))text = ""try? await Task.sleep(for: .milliseconds(200))}// Type out the titlefor index in finalText.indices {text = String(finalText.prefix(through: index)) + cursorlet milliseconds = (1 + UInt64.random(in: 0...1)) * 100try? await Task.sleep(for: .milliseconds(milliseconds))}// Wrap up the title sequencetry? await Task.sleep(for: .milliseconds(400))text = finalTextisFinished = true}}
}

​ContentView​​内容如下:

struct ContentView: View {@Environment(ViewModel.self) private var modelvar body: some View {@Bindable var model = modelNavigationStack {VStack {Spacer()VStack {Text(model.finalTitle).monospaced().font(.system(size: 50, weight: .bold)).padding(.horizontal, 40).hidden().overlay(alignment: .leading) {Text(model.titleText).monospaced().font(.system(size: 50, weight: .bold)).padding(.leading, 40)}Text("林黛玉进贾府").font(.title).padding(.top, 10).opacity(model.isTitleFinished ? 1 : 0)}Spacer()}.typeText(text: $model.titleText, finalText: model.finalTitle, isFinished: $model.isTitleFinished, isAnimated: !model.isTitleFinished)}}
}

这里在屏幕中央输出两段文本,第一段会以修饰符的动画效果进行输出直至结束,第二段在第一段文本输出完成后显示。

visionOS空间计算实战开发教程Day 11 标题动画

示例代码:​​GitHub仓库​​

其它相关内容请见​​虚拟现实(VR)/增强现实(AR)&visionOS开发学习笔记​​

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

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

相关文章

docker基本管理和docker相关概念

docker是开源的的应用容器引擎&#xff0c;基于go语言开发的&#xff0c;运行在linux系统当中的开源的轻量级的"虚拟机。 docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的&#xff0c;可以移植的&#xff0c;自给自足的容器 docker的宿主机是linux系…

[Unity数据管理]自定义菜单创建Unity内部数据表(ScriptableObject)

Unity 在开发的时候如果数据量比较大&#xff0c;或者一部分数据需要存在云端&#xff0c;那么就需要一些数据库 轻量型到大型的包括&#xff1a; 数组-内存存储读取 列表-内存存储读取 List<T> tList new List<T>(); XML-硬盘存储读取 JSON-硬盘存储读取 …

pycharm使用Anaconda中的虚拟环境【我的入门困惑二】

Anaconda的作用 Anaconda的存在&#xff0c;使得一台电脑上可以存在多个不同版本的python和相应的包&#xff0c;这解决了多个项目运行时&#xff0c;所需要的python和包版本不同的问题。 本文内容 今天就来简单说说如何在pycharm使用Anaconda中的虚拟环境。 详细介绍 首先…

慎用!3个容易被打的Python恶搞脚本

Python 无限恶搞朋友电脑&#xff0c;别提有多爽了&#xff0c;哈哈&#xff0c;打造自己的壁纸修改器&#xff0c;电脑无限锁屏&#xff0c; 无线弹窗&#xff0c;都在这里&#xff01;&#xff01;&#xff01; 1、修改电脑桌面壁纸 工具使用 开发环境&#xff1a;python3…

设计原则 | 依赖转置原则

一、依赖转置原则&#xff08;DIP&#xff1a;Dependence Inversion Principle&#xff09; 1、原理 高层模块不应该依赖低层模块&#xff0c;二者都应该依赖于抽象抽象不应该依赖于细节&#xff0c;细节应该依赖于抽象 2、层次化 Booch曾经说过&#xff1a;所有结构良好的面…

【408】计算机学科专业基础 - 计算机组成原理

一、计算机系统概述 【复习提示】 本章是组成原理的概述&#xff0c;考查时易针对有关概念或性能指标出选择题&#xff0c;也可能综合后续章节的内容出有关性能分析的综合题。掌握本章的基本概念&#xff0c;是学好后续章节的基础。部分知识点在初学时理解不深刻也无须担忧&am…

计算机操作系统3

1.虚拟机 VM 两类虚拟机的对比&#xff1a; 2.进程 进程的特征&#xff1a; 进程状态的转换&#xff08;五大状态&#xff09; 3.进程控制原语的作用 4.线程 ​​​​​线程的属性 实现方式 5.调度算法的评价指标

没有实权的PM如何做好项目管理?

在一些公司中&#xff0c;项目经理&#xff08;PM&#xff09;可能并没有实权&#xff0c;这种情况下如何做好项目管理呢&#xff1f;实际上&#xff0c;即使没有实权&#xff0c;PM仍然可以通过一些方法来确保项目的顺利进行。 首先&#xff0c;PM可以通过建立良好的沟通渠道来…

2024年软件测试面试八股文

前言 &#xff08;第一个就刷掉一大批人&#xff09; 有很多“会自动化”的同学来咨询技术问题&#xff0c;他总会问到我一些元素定位的问题。元素定位其实都不算自动化面试的问题。 一般我都会问&#xff1a;你是定位不到吗&#xff1f;通常结果都是说确实定位不到。 做自…

Windows磁盘管理中硬盘无法初始化怎么办?

硬盘未出现在“此电脑”选项下的情况并不少见&#xff0c;当您打开磁盘管理&#xff0c;它要么显示为磁盘未知&#xff0c;要么显示为未分配的空间&#xff0c;或者只是不显示磁盘容量。为了访问您的硬盘并充分利用它&#xff0c;您需要对其进行初始化。不幸的是&#xff0c;您…

Apache Kafka CVE-2023-25194(metasploit版)

Step1&#xff1a;用docker搭建环境 Step2&#xff1a;docker查看映射端口 Step3&#xff1a;访问特定端口&#xff0c;然后靶标应用。 Step4&#xff1a;用metasploit进行攻击&#xff1a; 首先&#xff0c;打开metasploit&#xff0c;然后查询需要攻击的板块&#xff0…

前端编码中快速填充内容--乱数假文

写前端页面的时候&#xff0c;如果要快速插入图片&#xff0c;可以使用 https://picsum.photos/ 详见笔者这篇博文&#xff1a; 工具网站&#xff1a;随机生成图片的网站-CSDN博客 可是&#xff0c;如果要快速填充文字内容该怎么做呢&#xff1f; 以前&#xff0c;我们都是…

【EI征稿中|SPIE出版】 第四届传感器与信息技术国际学术会议(ICSI 2024)

第四届传感器与信息技术国际学术会议&#xff08;ICSI 2024&#xff09; 2024 4th International Conference on Sensors and Information Technology&#xff08;ICSI 2024&#xff09; 第四届传感器与信息技术国际学术会议&#xff08;ICSI 2024&#xff09;将于2024年1月5…

Windows server 部署iSCSI共享磁盘搭建故障转移群集

在域环境下&#xff0c;在域控制器中配置iSCSI服务&#xff0c;配置共享网络磁盘&#xff0c;在节点服务器使用共享磁盘&#xff0c;并在节点服务器中搭建故障转移群集&#xff0c;实现故障转移 环境准备 准备3台服务器&#xff0c;配置都是8g2核&#xff0c;50g硬盘&#xf…

微服务开发:断路器详解

微服务是目前业界使用的最重要的实现方面。通过使用微服务架构&#xff0c;开发人员可以消除他们以前在单体应用程序中遇到的许多问题。展望未来&#xff0c;人们开始在微服务中搜索和采用各种模式。大多数时候&#xff0c;新模式的产生是为了解决另一个模式中出现的常见问题。…

指针(二)

这里写目录标题 字符指针字符指针与常量字符串的区别&#xff1a; 指针数组数组指针两者的区别&#xff1a;&数组名 &#xff0c;sizeof(arr)数组指针的使用数组参数&#xff0c;指针参数一维数组传参整型数组&#xff1a;整型指针数组&#xff1a; 一级指针传参二级指针传…

基于单片机自动饮料混合机控制系统设计

**单片机设计介绍&#xff0c;基于单片机自动饮料混合机控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机自动饮料混合机控制系统设计是一个涉及多个领域的复杂项目&#xff0c;包括单片机技术、传感器技术…

SQL手工注入漏洞测试(Access数据库)-墨者

———靶场专栏——— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 靶场背景&#xff1a; 来源&#xff1a; 墨者学院 简介&#xff1a; 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

用例图是什么?用什么工具绘制?

在软件工程中&#xff0c;用例图属于UML&#xff08;Unified Modeling Language&#xff09;的一种图形模型&#xff0c;是一个交流需求和设计的重要工具。 用例图主要用来展示软件系统功能需求和相关角色之间的交互方式。它描述了一个系统如何与外界进行交互&#xff0c;表示…

MYSQL全语法速查(含示例)

文章目录 1.从简单的查询开始查找所有记录(SELECT *)查找记录中的所有登录名(SELECT)查找登录名为admin的密码(WHERE)查找电话号码非空的记录(IS NOT NULL)查找所在城市为北京或者用户名字是李四的记录(OR)查找所在城市为北京并且用户名字是张三的记录(AND)查找用户名字是李四或…