当前位置: 首页 > article >正文

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}
}

相关文章:

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

SwiftUI 中 .overlay 两种写法的区别及拓展 一、.overlay 简介功能语法 二、写法 1:.overlay(Circle().stroke(Color.blue, lineWidth: 2))代码示例解释优点适用场景 三、写法 2:.overlay { Circle().stroke(.white, lineWidth: 4) }代码示例解释优点适用…...

深入理解QT的View-Model-Delegate机制和用法

文章目录 Model-View-Delegate机制Model(数据模型)设置模型属性访问元素操作元素数据排序封装好的模型View(视图)显示数据数据选择Delegate(代理)数据选择易用封装类QListWidgetQTreeWidgetQTableWidget元素拖拽代理模型参考示例Model-View-Delegate机制 Qt的View/Model/Deleg…...

C# ASP.NET 介绍

.NET学习资料 .NET学习资料 .NET学习资料 一、概述 ASP.NET是由微软创建的一个开源 Web 框架,用于使用.NET 构建现代化的 Web 应用程序和服务。它为开发者提供了一套丰富的工具、库和编程模型,使得创建功能强大、高效且安全的 Web 应用变得更加容易。…...

深入理解指针初阶:从概念到实践

一、引言 在 C 语言的学习旅程中,指针无疑是一座必须翻越的高峰。它强大而灵活,掌握指针,能让我们更高效地操作内存,编写出更优化的代码。但指针也常常让初学者望而生畏,觉得它复杂难懂。别担心,本文将用通…...

《手札·行业篇》开源Odoo MES系统与SKF Observer Phoenix API在化工行业的双向对接方案

一、项目背景 化工行业生产过程复杂,设备运行条件恶劣,对设备状态监测、生产数据采集和质量控制的要求极高。通过开源Odoo MES系统与SKF Observer Phoenix API的双向对接,可以实现设备状态的实时监测、生产数据的自动化采集以及质量数据的同步…...

oracle11g搭建主从集群

安装oracle11g参考:centos安装oracle11g数据库-CSDN博客 一、主库操作 sqlplus / as sysdba 1、开启归档模式和强制日志模式 shutdown immediate startup mount #开启归档模式和强制日志模式 alter database archivelog; alter database force logging; #开启补…...

暂未整理啊

测码学院 python的数据类型 不可变数据类型:字符串/数字/元组/ type(变量名) 获得数据的类型 str:字符串 int:整数 float:浮点数 bool:true/false 布尔类型 list:列表 dict&…...

重庆西站公路桥梁自动化监测

1.项目概述 重庆西站属于渝黔铁路的配套工程,是承担兰渝、川黔、渝昆等多条铁路的特级客运站,未来重庆铁路三大客运站之一。作为我国西部地区规模最大的火车站、重庆西站于2014年在沙坪坝区上桥开工建设,该站东临内环高速,西靠中梁山&#x…...

JavaScript系列(70)--响应式编程进阶详解

JavaScript响应式编程进阶详解 🔄 今天,让我们深入探讨JavaScript响应式编程的进阶内容。响应式编程是一种强大的编程范式,它能够帮助我们更好地处理异步数据流和状态管理。 响应式编程进阶概念 🌟 💡 小知识&#x…...

安装指定版本的pnpm

要安装指定版本的 pnpm&#xff0c;可以使用以下方法&#xff1a; 方法 1: 使用 pnpm 安装指定版本 你可以通过 pnpm 的 add 命令来安装指定版本&#xff1a; pnpm add -g pnpm<版本号>例如&#xff0c;安装 pnpm 的 7.0.0 版本&#xff1a; pnpm add -g pnpm7.0.0方法…...

Dockerfiles 的 Top 10 常见 DevOps/SRE 面试问题及答案

1. RUN 和 CMD 之间有什么区别&#xff1f; RUN : 在镜像构建过程中执行命令&#xff0c;创建一个新的层。通常用于安装软件包。 示例: RUN apt-get update && apt-get install -y curlCMD : 指定容器启动时默认运行的命令。它在运行时执行&#xff0c;而不是在构建过程…...

头条百度批量采集软件说明文档

旧版说明文档《头条号文章批量采集软件4.0版本说明文档&#xff01;头条/微头条文章批量采集》 头条的采集软件已经更新了好多个版本了&#xff0c;一直没有做详细的介绍文档&#xff0c;最近更新了一些功能进去&#xff0c;一块来写一下说明文档。 1、主界面 2、头条作者采集…...

36.日常算法

1.最小栈 题目来源 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删除堆栈顶部的元素。 int top() 获取堆…...

计算机考研复试上机04

目录 6、向量 1&#xff09;完数与盈数&#xff08;清华大学复试上机题&#xff09; 7、队列 1&#xff09;约瑟夫问题 No. 2 8、栈 1&#xff09;简单计算器&#xff08;浙江大学复试上机题&#xff09; 2&#xff09;堆栈的使用&#xff08;吉林大学复试上机题&#xf…...

【面试】面试常见的智力题

引言 在技术面试中&#xff0c;除了考察编程能力和算法知识外&#xff0c;智力题也是常见的考察方式。智力题不仅能够测试候选人的逻辑思维能力&#xff0c;还能反映其解决问题的创造力和应变能力。本文将整理一些常见的面试智力题&#xff0c;并详细分析解题思路&#xff0c;…...

【动态规划】风扫枯杨,满地堆黄叶 - 9. 完全背包问题

本篇博客给大家带来的是完全背包问题之动态规划解法技巧. &#x1f40e;文章专栏: 动态规划 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心要快乐顺…...

BGP基础协议详解

BGP基础协议详解 一、BGP在企业中的应用二、BGP概述2.1 BGP的特点2.2 基本配置演示2.3 抓包观察2.4 BGP的特征三、BGP对等体关系四、bgp报文4.1 BGP五种报文类型(重点)4.2 BGP报文格式-报文头格式4.3 Open报文格式4.4 Update报文格式4.5 Notification报文格式4.6 Route-refre…...

LeetCode刷题---数组---840

矩阵中的幻方 https://leetcode.cn/problems/magic-squares-in-grid/submissions/598584907/ 题目&#xff1a; 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成…...

Visual Studio踩过的坑

统计Unity项目代码行数 编辑-查找和替换-在文件中查找 查找内容输入 b*[^:b#/].*$ 勾选“使用正则表达式” 文件类型留空 也有网友做了指定&#xff0c;供参考 !*\bin\*;!*\obj\*;!*\.*\*!*.meta;!*.prefab;!*.unity 打开Unity的项目 注意&#xff1a;只是看&#xff0…...

【深度学习入门实战】基于Keras的手写数字识别实战(附完整可视化分析)

​ 本人主页:机器学习司猫白 ok,话不多说,我们进入正题吧 项目概述 本案例使用经典的MNIST手写数字数据集,通过Keras构建全连接神经网络,实现0-9数字的分类识别。文章将包含: 关键概念图解完整实现代码训练过程可视化模型效果深度分析环境准备 import numpy as np impo…...

SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界

文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中&#xff0c;我们通过进程监控和日志分析来发现系统问题&…...

计算机毕业设计——Springboot的旅游管理

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…...

【通俗易懂说模型】反向传播(附多元分类与Softmax函数)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...

Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统

Kickstart自动化安装过程中自动选择较小的磁盘安装操作系统 需求 在实际生成操作过程中&#xff0c;一般会遇到物理服务器存在多块盘的情况。 安装过程中&#xff0c;磁盘的标签是随机分配的&#xff0c;并不是空间较小的盘&#xff0c;就会使用较小的磁盘标签 而需求往往需要…...

128,【1】buuctf [极客大挑战 2019]PHP

进入靶场 提示了备份文件 抓包&#xff0c;扫描 扫描出了两个有反应的 访问index.php没反应&#xff0c;但www.zip成功下载了文件 index.php里得到如下有用信息 <?phpinclude class.php;$select $_GET[select];$resunserialize($select);?> 所以我们要通过GET 方…...

3.3 学习UVM中的uvm_driver 类分为几步?

文章目录 前言1. 定义2. 核心功能3. 适用场景4. 使用方法5. 完整代码示例5.1 事务类定义5.2 Driver 类定义5.3 Sequencer 类定义5.4 测试平台 6. 代码说明7. 总结 前言 以下是关于 UVM 中 uvm_driver 的详细解释、核心功能、适用场景、使用方法以及一个完整的代码示例&#xff…...

系统思考—双环学习

前几天&#xff0c;一个企业高管向我提到&#xff1a;“我们调整了N次方案&#xff0c;市场策略、团队激励、管理制度&#xff0c;能改的全改了&#xff0c;怎么还是不见起色&#xff1f;” 这让我想到典型的单环学习&#xff0c;简单来说就是&#xff1a;发现问题 → 采取行动…...

QTreeView和QTableView单元格添加超链接

QTreeView和QTableView单元格添加超链接的方法类似,本文仅以QTreeView为例。 在QTableView仿Excel表头排序和筛选中已经实现了超链接的添加,但是需要借助delegate,这里介绍一种更简单的方式,无需借助delegate。 一.效果 二.实现 QHTreeView.h #ifndef QHTREEVIEW_H #def…...

elastic search 的 highlight

Elasticsearch 的 highlight 功能用于在搜索结果中突出显示匹配的文本片段。这对于用户界面上的搜索结果展示非常有用&#xff0c;因为它可以帮助用户快速定位到他们搜索的关键词。 1. 基本用法 在 Elasticsearch 中&#xff0c;highlight 功能通常在查询中使用&#xff0c;并…...

【MySQL篇】行格式详解

MySQL行格式详解 文章目录 MySQL行格式详解&#x1f389; 什么是行格式&#x1f431;‍&#x1f464; 如何查看行格式&#x1f431;‍&#x1f680; InnoDB 行格式有哪些&#xff1f;&#x1f431;‍&#x1f3cd; Compact 行格式&#x1f6a9; 额外信息&#x1f680; 变长字段…...