SwiftUI(四)- 布局(VStack、HStack、ZStack)

引言

页面的搭建和布局在应用开发中几乎占据了一半的代码量。定于iOS开发而言,相较于其它平台,UIKit的布局方式显得相对局限,通常只有绝对布局和相对布局两种方案。而在Flutter或者Android开发中,布局选项更为丰富,比如横向布局,纵向布局或者网格布局等,使得界面设计更加灵活。然而,随着SwiftUI的引入,这种情况得到了极大的改善。

SwiftUI 采用声明式的方式构建用户页面,不仅简化了布局代码,还带来了全新的VStack、HStack和ZStack等核心布局组件。借助这些堆叠布局,我们可以轻松实现垂直、水平及重叠布局,构建出适应性更强的UI界面。本篇博客将深入探讨这些布局组件的使用场景及实现方式,帮助大家更好地掌握SwiftUI中的布局设计。

创建堆栈布局

在SwiftUI中我们必须返回一个确定的视图,也就是我们要显示的界面。而当我们需要在界面上返回多个视图时,比如图片+文字,这时候我们就需要告诉SwiftUI这个多个视图该如何进行布局排列,这就是堆栈的用武之处。

事实上在UIKit中已经提供了一个类似的布局组件UIStackView,UIStackView会将添加在它上面的子视图按照我们设置的参数进行横向或者纵向自动排列。而SwiftUI中的堆栈有三种形式:水平(HStack)、垂直(VStack)、还有个基于深度的(ZStack),后者将用于当你希望多个子视图重叠时。

VStack

Xcode为我们创建的SwiftUI模版项目,其实就已经使用了到了堆栈这个组件:

struct ContentView: View {var body: some View {VStack {Image(systemName: "globe").imageScale(.large).foregroundStyle(.tint)Text("Hello, world!")}.padding()}
}

此时图片和文字将会垂直排列在屏幕居中,并且它们之间会有一些自动的间距。

HStack

如果我们想要让标签并排显示,那么只需要将VStack替换为HStack,代码如下:

        HStack {Image(systemName: "globe").imageScale(.large).foregroundStyle(.tint)Text("Hello, world!")}.padding()

ZStack

ZStack专门用于创建重叠内容,当我们想要为视图创建一个比视图本身还大的背景时它将非常有用,它的使用方法和其他两种堆栈相同,比如,我们在一段文本下面放置一张大图片。

        ZStack {Image("swift")Text("Hello, world!").font(.largeTitle).foregroundStyle(.red)}

设置堆栈布局的对齐方式和间距

我们可以通过设置对齐方式及子组件的间距来自定义堆栈的布局样式。

间距

我们在创建堆栈的时候可以通过设置spacing参数来给内部子元素指定一些间距,代码如下:

        //间距VStack(spacing: 50) {Text("Hello, world!").foregroundStyle(.red)Text("Hello, world!").foregroundStyle(.red)}

我们还可以在两个子视图之间创建分隔符,以便SwiftUI在堆栈中的每个项目之间进行小的视觉区分,代码如下:

        //间距VStack(spacing: 50) {Text("Hello, world!").foregroundStyle(.red)Divider()Text("Hello, world!").foregroundStyle(.red)}

但是在ZStack中没有间距属性,因为它没有任何意义。

对齐方式

默认情况下,堆栈中的项目都是居中对齐的。在HStack中里面的所有组件将会垂直居中,因此如果我们创建两个不同高度文本视图,它们都将居中对齐。而在VStack的情况下,这意味着所有子组件将会水平居中,如果有两个长度不同的文本视图,它们都将水平居中对齐。

但是我们可以通过设置alignment参数来修改对齐方式,代码如下:

        // 左对齐VStack(alignment: .leading) {Text("SwiftUI")Text("Hello, world!")}

这样两个文本的左边缘会对齐,但是它们仍然最终会位于屏幕中间,因为堆栈只占用所需的空间。

我们还可以同时设置对齐方式和间距,代码如下:

        // 左对齐VStack(alignment: .leading,spacing: 10) {Text("SwiftUI")Text("Hello, world!")}

设置单个视图的内边距

在其它平台的布局中通常除了与其它视图的外边距之外,还有有一个内边距的属性,但是UIKit中通常我们只能通过自定义视图或者通过为视图添加父视图来达到这个问题。SwiftUI也改善了这个问题,它允许我们使用padding()修饰符在视图周围进行填充。如果我们不设置任何参数,直接使用修饰符,那么所有边都会获得系统默认的填充,代码如下:

        // 内边距VStack {Text("Hello, world!").padding().background(.red)Text("Hello, world!").background(.green)}

但是值得注意的是这种链式语法,当我们修饰符调用的顺序不一致时,效果也不一致嗷,比如,如果我们先设置背景颜色,再设置padding()虽然也会有内边距,但是内边距不会被设置成背景颜色:

        // 内边距VStack {Text("Hello, world!").padding().background(.red)Text("Hello, world!").background(.green).padding()}

内边距还可以自定义要填充的位置或者填充的大小,比如我们只想往左侧添加系统的边距:

            Text("Hello, world!").background(.blue).padding(.leading)

或者我们希望指定往左侧添加的边距为40:

            Text("Hello, world!").background(.blue).padding(.leading,40)

结语

本篇博客通过对SwiftUI中的VStack、HStack和ZStack的探讨,我们已经能够快速实现各种灵活的布局组合,再结合间距、对齐方式已经设置单个视图的内边距,可以轻松适配不同界面的需求。这种声明式的布局方式,不仅让代码更加简洁直观,还大大提高了开发效率。在实际项目开发中,灵活运用这些布局工具,将版主我们打造出更具美感、易与维护的UI设计。希望本篇博客能够为你的SwiftUI开发提供有价值的参考!

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

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

相关文章

【mod分享】极品飞车9冬日mod,支持光追,想体验一把冬天的Rockport市吗

各位好,今天小编给大家带来一款新的高清重置魔改MOD,本次高清重置的游戏叫《极品飞车9最高通缉》。 《极品飞车:最高通缉》作为一款2005年的游戏,《极品飞车:最高通缉》的画面效果还是可以的,效果全开之后…

【状态机DP】力扣1186. 删除一次得到子数组最大和

给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能…

手机拍证件照,换正装有领衣服及底色的方法

证件照在我们的职业生涯的关键节点是经常会用到的,比如毕业入职、人事档案建立、升迁履历、执业资格考试和领证等,这些重要的证件照往往要求使用正装照,有时候手头没有合适的衣服,或者原先的证件照背景色不符合要求,就…

numpy——数学运算

一、标量——矢量 import numpy as npa 3.14 b np.array([[9, 5], [2, 7]])print(a) print(b)# ---------- 四则运算 ---------- print(a b) # np.add print(a - b) # np.subtract print(a * b) # np.multiply print(a / b) # np.divide 二、矢量——矢量 import nump…

优选算法精品课--双指针算法(2)

双指针算法(2) 1、有效三角形的个数1.1 题目解析1.2 思路解析1.3 代码实现 2、和为s的两个数2.1 题目解析2.2 思路解析2.3 代码实现 3、三数之和3.1 题目解析3.2 思路解析3.3 代码实现 4、四数之和4.1 题目解析4.2 思路解析4.3 代码实现 5 总结 1、有效三…

4个提取音频办法,轻松实现视频转音频!

在信息爆炸的时代,视频内容以其直观、生动的特点占据了互联网的大半江山。然而,在某些场景下,我们可能更倾向于只听取音频部分,无论是驾驶途中听讲座、跑步时享受音乐视频中的纯音乐的场景,还是为了节省流量和存储空间…

Python continue和break

continue的作用是: 中断所在循环的当次执行,直接进入下一次 break的作用是: 直接结束所在的循环 注意事项: continue和break,在for和while循环中作用一致 在嵌套循环中,只能作用在所在的循环上&#x…

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用?小结:同步调用优缺点 1-2 异步调用什么是异步调用?小结:异步调用的优缺点,什么时候使用异步调用? 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…

300元蓝牙耳机性价比高的有哪些?学生平价蓝牙耳机推荐

你是否正在为选择一款性价比高的蓝牙耳机而烦恼?是否希望找到一款既适合学生使用,又能在预算内满足需求的蓝牙耳机?300元蓝牙耳机性价比高的有哪些?如果你有这样的需求,那么下面我将为大家提供一些有益的参考&#xff…

中间件安全(三)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞(cve_2021_41773)。 靶场链接:Vulfocus 漏洞威胁分析平台 一,漏洞简介。 cve_2021_41773漏洞…

【STM32外设及其应用】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

pyvideotrans 最佳AI翻译软件

文章目录 体验视频翻译配音工具主要用途和功能预打包版本(仅win10/win11可用,MacOS/Linux系统使用源码部署)MacOS源码部署Linux 源码部署Window10/11 源码部署源码部署问题说明使用教程和文档语音识别模型:视频教程(第三方)软件预览截图相关联项目致谢 体验 不错&a…

【含开题报告+文档+PPT+源码】基于SpringBoot的健康知识学习分享平台的设计与实现

开题报告 随着人们生活水平的提高和健康意识的增强,健康知识在日常生活中的重要性日益凸显。传统的健康知识获取途径如书籍、讲座等虽然具有一定的效果,但存在信息更新慢、交互性差等局限性。同时,互联网的普及和移动互联网的发展为人们提供…

【算法刷题指南】双指针

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

前端零基础入门到上班:【Day1】什么是前端?

本来打算开付费专栏 但是想起那句话 赠人玫瑰手留余香 引言1. 什么是前端?1.1 前端的定义1.2 前端的三大核心技术1.3 前端框架和工具 2. 什么是后端?2.1 后端的定义2.2 后端的组成要素2.3 后端框架和工具 3. 前后端的区别4. 什么是前后端分离&#xff1f…

院士领衔,瑞德磁电誓将中国红染遍磁电产业

【哔哥哔特导读】今天我们从广州来到淮北,参观一家由院士领衔创立的金属磁粉芯企业,看他们如何将中国红染遍磁电产业,一步步实现金属磁粉芯的国产替代。 想要成为一个领域的头部企业,技术实力与产能规模缺一不可,而瑞…

[翱捷]让SDK跑起来了

一&#xff0c;环境安排及验证 参照文档 <<ASR编译环境及编译步骤--3601.docx>> <<Windows环境搭建.docx>> <<ChildWatchSWUG_1221.doc>> 主要工具包括 ARM DS-5 V5.26.2 (64-bit)ActivePerl 5.28.1 Build 2801 (64-bit)msys2-x86_6…

摊牌了,创业失败了

“以为这个网红不会塌房&#xff0c;结果一觉醒来&#xff0c;天塌了……” ——某电商供应商 “这不是禁不住网上的各种诱惑吗&#xff0c;9月30日纵身入局&#xff0c;节假日几天不能买入&#xff0c;8号上班第一天我还看着钱数开心呢。结果今天……” ——一位投资失利&…

Python日志系统详解:Logging模块最佳实践

Python日志系统详解&#xff1a;Logging模块最佳实践 在开发Python应用程序时&#xff0c;日志记录是排查问题、监控系统状态、优化性能的重要手段。Python标准库中提供了强大的logging模块&#xff0c;使开发者可以轻松实现灵活的日志系统。本文将详细介绍Python的logging模块…

Java实现邮箱发送邮件添加定时任务(二)

上篇文章我们谈到邮件的发送&#xff0c;但是可以发现使用非常局限&#xff0c;这里我做了一个简单的修改&#xff0c;添加了定时发送功能&#xff0c;可以帮助我们处理很多繁琐的事 这里我写了一个简单的案例 1. 先在pom文件里面添加依赖 2.配置yml文件 3.写一个定时任务类…