SwiftUI 中 .overlay 两种写法的区别及拓展

SwiftUI 中 .overlay 两种写法的区别及拓展

    • 一、`.overlay` 简介
      • 功能
      • 语法
    • 二、写法 1:.overlay(Circle().stroke(Color.blue, lineWidth: 2))
      • 代码示例
      • 解释
      • 优点
      • 适用场景
    • 三、写法 2:.overlay { Circle().stroke(.white, lineWidth: 4) }
      • 代码示例
      • 解释
      • 优点
      • 适用场景
    • 四、对比与选择
    • 五、拓展知识
      • 更多的 `.overlay` 元素
      • 组合和嵌套 `.overlay` 元素
      • 结合其他修饰符
      • 动画和交互

在 Swift 开发中,尤其是使用 SwiftUI 进行界面开发时,.overlay 是一个非常重要且功能强大的修饰符。它为开发者提供了一种在现有视图之上添加额外元素的方式,丰富了用户界面的层次和功能,为设计更具吸引力和表现力的界面提供了更多可能性。

一、.overlay 简介

功能

  • .overlay 是 SwiftUI 中的一个视图修饰符,它允许你在另一个视图之上添加额外的视图。这个额外的视图可以是任何 SwiftUI 视图,包括形状、文本、图像、按钮或它们的组合,并且可以根据需要进行布局、样式和动画的设置。
  • 当你使用 .overlay 时,添加的元素会显示在原始视图的上方,就像是覆盖在上面一样。这种叠加的效果可以用于添加装饰元素、强调信息、显示状态指示或创建复杂的组合视图。

语法

view.overlay(content: () -> Content)
  • view 是要添加 overlay 的原始视图。
  • content 是一个尾随闭包,它返回要添加的叠加视图。这个闭包内可以包含一个或多个视图元素,这些元素将被添加到 view 的顶部。

二、写法 1:.overlay(Circle().stroke(Color.blue, lineWidth: 2))

代码示例

.overlay(Circle().stroke(Color.blue, lineWidth: 2))

解释

  • 这种写法是将 Circle().stroke(Color.blue, lineWidth: 2) 作为 .overlay 的参数直接传递进去。
  • 首先,创建了一个 Circle 实例,它是一个圆形视图元素。在 SwiftUI 中,Circle 是一个基本的形状视图,可以用来绘制圆形。
  • 然后,使用 .stroke(Color.blue, lineWidth: 2) 对该 Circle 进行描边处理,将描边颜色设置为蓝色,线宽设置为 2 个单位。.stroke 是一个用于给形状添加描边的修饰符,它允许你设置颜色和线宽,让形状的轮廓更加突出。
  • 最后,将这个已经设置好描边的 Circle 作为 .overlay 的内容添加到父视图上。

优点

  • 简洁性:非常简洁明了,适合于简单的 overlay 操作。当你只需要添加一个简单的元素,并且不需要对其进行更多复杂的操作或添加额外的子元素时,这种方式可以让你的代码保持简洁,易于阅读和快速编写。

适用场景

  • 适用于简单的装饰性元素添加,比如在一个按钮上添加一个简单的圆形装饰、在文本视图上添加一个圆形的强调标记等。
  • 当你确定 overlay 的元素仅为一个简单的形状,且该形状的样式不需要复杂的设置或条件判断时,这种写法可以节省代码空间。

三、写法 2:.overlay { Circle().stroke(.white, lineWidth: 4) }

代码示例

.overlay {Circle().stroke(.white, lineWidth: 4)
}

解释

  • 这里使用了尾随闭包的形式。尾随闭包是 Swift 中一种简洁的语法,允许我们将闭包作为函数的最后一个参数时,可以将闭包的代码写在函数调用的大括号 {} 后面。
  • .overlay 的大括号内,我们创建了一个 Circle 实例,并使用 .stroke(.white, lineWidth: 4) 对其进行描边,将描边颜色设置为白色,线宽设置为 4 个单位。

优点

  • 灵活性和扩展性:这种写法更具扩展性,尤其适合需要在 overlay 中添加多个元素或执行更复杂逻辑的情况。
  • 可以在闭包内添加更多的视图元素,例如,你可以添加多个 Circle 或其他形状,并对它们进行不同的样式设置和布局操作。
  • 支持更复杂的逻辑,如根据某些条件添加或修改元素,进行循环创建多个元素,甚至可以在闭包内进行嵌套视图的布局操作。

适用场景

  • 当需要在 overlay 中添加多个元素,例如,在一个视图上添加多个形状或嵌套视图时,可以使用这种方式。
  • 对于需要根据不同状态或用户输入动态改变 overlay 元素的情况,使用尾随闭包可以更方便地添加逻辑,例如:
.overlay {if someCondition {Circle().stroke(.green, lineWidth: 3)} else {Rectangle().fill(.red)}
}

四、对比与选择

  • 简洁 vs 灵活

    • 如果你只是想要快速添加一个简单的 overlay 元素,不涉及复杂的逻辑和多个元素,写法 1 是一个不错的选择,它可以使代码简洁。
    • 而当你预计 overlay 元素可能会变得复杂,或者需要添加多个元素、根据不同情况调整元素时,写法 2 提供了更大的灵活性和扩展性。
  • 可读性和可维护性

    • 对于初学者来说,写法 1 可能更容易理解,因为它直接明了。
    • 然而,对于有经验的开发者,尤其是处理复杂 UI 的开发者,写法 2 可以让代码更具结构,更易于维护,特别是当需要在 overlay 中进行更多的布局和元素操作时。

五、拓展知识

更多的 .overlay 元素

  • 除了 Circle,还可以使用其他形状,如 RectangleCapsuleEllipse 等,例如:
.overlay(Rectangle().fill(Color.yellow))

组合和嵌套 .overlay 元素

  • 可以将多个 .overlay 元素组合使用,或者在 .overlay 中嵌套多个元素,例如:
.overlay {VStack {Circle().fill(Color.red)Text("Hello, World!")}
}

这将在父视图上叠加一个垂直排列的圆形和文本元素。

结合其他修饰符

  • 可以将 .overlay 与其他修饰符结合使用,以实现更丰富的效果。例如,结合 .padding 可以为 overlay 元素添加内边距:
.overlay {Circle().stroke(.blue, lineWidth: 2)
}.padding()

动画和交互

  • 可以在 .overlay 元素中添加动画或交互元素,使界面更加生动和具有交互性。例如,使用 @State 变量和 animation 修饰符为 overlay 元素添加动画:
@State private var isAnimating = false
var body: some View {VStack {Text("Animated Overlay")}.overlay {Circle().stroke(Color.green, lineWidth: 2).scaleEffect(isAnimating? 1.5 : 1.0).animation(.easeInOut(duration: 1).repeatForever(autoreverses: true))}.onAppear {isAnimating = true}
}

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

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

相关文章

STM32系统架构介绍

STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射(特殊的存储器)2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司&#xff0c…

Leetcode - 149双周赛

目录 一、3438. 找到字符串中合法的相邻数字二、3439. 重新安排会议得到最多空余时间 I三、3440. 重新安排会议得到最多空余时间 II四、3441. 变成好标题的最少代价 一、3438. 找到字符串中合法的相邻数字 题目链接 本题有两个条件: 相邻数字互不相同两个数字的的…

2025.2.10 每日学习记录3:技术报告只差相关工作+补实验

0.近期主任务线 1.完成小论文准备 目标是3月份完成实验点1的全部实验和论文。 2.准备教资笔试 打算留个十多天左右,一次性备考笔试的三个科目 1.实习申请技术准备:微调、Agent、RAG 据央视财经,数据显示,截至2024年12月…

【苍穹外卖】修改前端代码解决修改Nginx端口后websocket连接失败的问题

解决方案——修改前端js代码 步骤一 找到文件app.d0aa4eb3.js(…\nginx-1.20.2\html\sky\js\app.d0aa4eb3.js),将n"ws://localhost/ws/"改成下面的内容。 // 改成n"ws://localhost:800/ws/"仍然不行——页面…

本地基于GGUF部署的DeepSeek实现轻量级调优之二:检索增强生成(RAG)

前文,我们在本地windows电脑基于GGUF文件,部署了DeepSeek R1 1.5B模型,如果想在离线模式下加载本地的DeepSeek模型自行对进行训练时,是不能直接使用GGUF文件进行训练的,但是可以对模型进行微调,以下说的是第…

开发完的小程序如何分包

好几次了,终于想起来写个笔记记一下 我最开始并不会给小程序分包,然后我就各种搜,发现讲的基本上都是开发之前的小程序分包,可是我都开发完要发布了,提示我说主包太大需要分包,所以我就不会了。。。 好了…

Java进阶篇之多线程

引言 🚀 在前面的文章中,我们介绍了NIO(Java进阶篇之NIO基础)。你是不是曾经在面对需要处理大量任务的应用时,感觉单线程根本不够用?😓 如果你想让你的应用运行得更快、更高效,多线…

Visual Studio 使用 “Ctrl + /”键设置注释和取消注释

问题:在默认的Visual Studio中,选择单行代码后,按下Ctrl /键会将代码注释掉,但再次按下Ctrl /键时,会进行双重注释,这不是我们想要的。 实现效果:当按下Ctrl /键会将代码注释掉,…

DeepSeek投喂数据(训练AI)

1、拉取nomic-embed-text 打开命令行,运行:ollama pull nomic-embed-text 这里需要先安装ollama ,不过大家应该在本地部署模型时已经安装了 拉取成功就行了,后续在配置AnythingLLM时用到 2、下载 AnythingLLM 地址&#xff1a…

【原创精品】基于Springboot3+Vue3的学习计划管理系统

大家好,我是武哥,最近给大家手撸了一个基于SpringBoot3Vue3的学习计划管理系统,可用于毕业设计、课程设计、练手学习,系统全部原创,如有遇到网上抄袭站长的,欢迎联系博主~ 项目演示视频 https://www.bili…

逆势而上,门店规模拓展的智慧攻略-中小企实战运营和营销工作室博客

逆势而上,门店规模拓展的智慧攻略-中小企实战运营和营销工作室博客 在竞争激烈、风云变幻的商业市场中,多数品牌在困境中艰难求生,而部分佼佼者却能突破重重阻碍,实现门店规模的逆势扩张。这些成功案例背后,究竟隐藏着…

基于改进型灰狼优化算法(GWO)的无人机路径规划

内容: 基于改进型灰狼优化算法的无人机轨迹规划 GWO是一种群体智能优化算法,模仿灰狼的社会等级和狩猎行为。原始的GWO有一些局限性,比如容易陷入局部最优,收敛速度慢等,所以改进型的GWO可能通过不同的策略来优化这些…

网络安全与AI:数字经济发展双引擎

在2025年年初,一场科技攻防战引发了全球关注。国产人工智能DeepSeek的爆火,伴随着大规模的网络攻击事件,将网络安全的重要性推上了风口浪尖。 在此背景下,我们计划探讨网络安全与人工智能如何为数字经济发展提供强大动力。网络安…

2.11学习记录

web——CTFHub XSS学习 学习资料:xss(跨站攻击) 原理 1.黑客发送带有xss恶意脚本的链接给用户 2.用户点击了恶意链接,访问了目标服务器(正常的服务器) 3.目标服务器(正常的服务器&#xff09…

个人毕业设计--基于HarmonyOS的旅行助手APP的设计与实现(挖坑)

在行业混了短短几年,却总感觉越混越迷茫,趁着还有心情学习,把当初API9 的毕业设计项目改成API13的项目。先占个坑,把当初毕业设计的文案搬过来 摘要:HarmonyOS(鸿蒙系统)是华为公司推出的面向全…

零成本搭建私人图床教程:CloudFlare R2 + PicGo 完整方案

零成本搭建私人图床教程:CloudFlare R2 PicGo 完整方案 🚀 前言 图片托管服务在现代内容创作中扮演着重要角色。无论是技术博客、文档编写,还是在线教程制作,都离不开可靠的图片存储和分发系统。本教程将详细介绍如何利用 Clou…

Word2vec Skip-Gram 模型

图例 Skip-gram 模型,假设句子中的每个词都决定了相邻词的选取,所以你可以看到Skip-gram模型的输入是 W t W_{t} Wt​, 预测的输出是 W t W_t Wt​ 周边的词 也是说Skip-gram的目标是:给定一个中心词 W t W_t Wt​, 预测其上下…

【R语言】相关系数

一、cor()函数 cor()函数是R语言中用于计算相关系数的函数,相关系数用于衡量两个变量之间的线性关系强度和方向。 常见的相关系数有皮尔逊相关系数(Pearson correlation coefficient)、斯皮尔曼秩相关系数(Spearmans rank corre…

网络工程师 (32)TRUNK

一、定义 TRUNK,也称为端口汇聚、链路汇聚或多链路汇聚,是一种网络技术,其本质是将多个以太网端口绑定在一起作为一个逻辑链路来使用。通过TRUNK技术,用户在使用这个逻辑链路时,就好像是在使用一条独立的物理链路一样&…

“可通过HTTP获取远端WWW服务信息”漏洞修复

环境说明:①操作系统:windows server;②nginx:1.27.1。 1.漏洞说明 “可通过HTTP获取远端WWW服务信息”。 修复前,在“响应标头”能看到Server信息,如下图所示: 修复后,“响应标头…