SwiftUI 6.0(iOS/iPadOS 18)中全新的 Tab 以及 Sidebar+悬浮 TabView 样式

在这里插入图片描述

概览

看来苹果一直对 iPadOS 中标签栏(TabView)不甚满意。这不,在 WWDC 2024 中苹果又对 TabView 外观做了大幅度的进化。

在这里插入图片描述

现在我们可以在顶部悬浮条和左侧的 Sidebar 两种不同布局之间恣意切换 TabView 的外观啦。而且,这在 SwiftUI 6.0 中显得尤为简单。

在本篇博文中,您将学到如下内容:

  • 概览
  • 1. iPadOS 18 中全新的 Sidebar+悬浮 TabView 样式
  • 2. 新 TabView 样式在 iOS 18 中的表现
  • 3. SwiftUI 6.0 新的 Tab 和 TabSection 原生视图
  • 4. 让 Tab 懂你所选
  • 5. 调整 Tab 的显示位置
  • 总结

看来 iPadOS 18 对 TabView 外观和功能都做了重量级的升级,那小伙伴们还等什么呢?

Let‘s find out!!!😉


1. iPadOS 18 中全新的 Sidebar+悬浮 TabView 样式

为了最大化利用屏幕空间,从 iPadOS 18 开始苹果有史以来第一次将位于底部的 TabView:

在这里插入图片描述

神奇的变为悬浮条置于窗口的顶部:

在这里插入图片描述

从上面两张图中我们可以对比在 iPadOS 18 中系统默认的时钟 App 中标签栏的新外观。

当需要显示悬浮条内额外标签页的内容时,我们还可以轻按最左侧的展开按钮将其变形为 Sidebar 模式以便将所有标签项一览无遗:
在这里插入图片描述

不仅如此,我们还可以恣意调整 Sidebar 和悬浮条中标签项的位置、将它们打包到组中显示,甚至定制它们的外观:

在这里插入图片描述

在这里插入图片描述

按苹果的话来说:标签栏的新外观可以最大化利用显示空间,并让我们的 App 极具现代化外观的范儿。 我们可以在悬浮条和 Sidebar 两者间随意切换从而解决了“麻雀虽小”和“面面俱到”之间鱼与熊掌不可兼得的问题。

2. 新 TabView 样式在 iOS 18 中的表现

为了能保持 iPadOS 18 中新 TabView 的延展性,在 iOS 18 中新的标签栏会“退化”为之前经典的样式。

在这里插入图片描述

与之前经典 TabView 外观类似:新的 TabView 在 iOS 18 中右侧额外显示不下的内容也会统统放到单独的 More 标签项中去。

所不同的是,iOS 18 新标签栏中的标签组(TabSection)会消失的“无影无踪”,其中的标签会被直接放在底部的标签栏中。

有些小伙伴们可能会好奇:iPhone pro max 大屏设备横屏时新的 TabView 会有怎样的表现?
在这里插入图片描述

上面就是 iPhone pro max 横屏时新标签栏在 iOS 18 中的样子。可以看到:除了最右侧 More 标签中的内容被平铺显示以外和之前并无二致。所以想利用大屏 iPhone 设备适配新 TabView 悬浮条外观的小伙伴们可能要暂时失望了。

了解完 iOS 18 中新标签栏的模样之后,下面就让我们来看看如何用代码展现它们吧。

在 SwiftUI 6.0 中适配 TabView 新外观超级简单,然我们马上来撸码为证!

3. SwiftUI 6.0 新的 Tab 和 TabSection 原生视图

从 SwiftUI 6.0 开始,苹果增加了全新的 Tab 和 TabSection 原生视图,专门为新 TabView 来效“犬马之劳”:

在这里插入图片描述
在这里插入图片描述
其中,Tab 被用来取代原来的 tabItem() 修改器,而 TabSection 则用来将多个 Tab 汇聚成组。

在 iPadOS 18 之前,我们是这样描述 TabView 外观的:

struct ContentView: View {@Environment(\.horizontalSizeClass) var hSize@State var tabSelecting = TabValue.allTopics@State var moveFromLeading = truevar body: some View {TabView(selection: $tabSelecting) {AnimSubView(title: "Main", bgColor: .white, imageName: "main", isMoveFromLeading: moveFromLeading).tabItem {Label("Main", systemImage: "house")}.tag(TabValue.main)AnimSubView(title: "This is the blog page", bgColor: .yellow, isMoveFromLeading: moveFromLeading).tabItem {Label("Topics", systemImage: "pencil")}.tag(TabValue.allTopics)AnimSubView(title: "SwiftUI topic", bgColor: .purple.opacity(0.3), isMoveFromLeading: moveFromLeading).tabItem {Label("SwiftUI", systemImage: "swift")}.tag(TabValue.swiftUI)AnimSubView(title: "Concurrency topic", bgColor: .green, isMoveFromLeading: moveFromLeading).tabItem {Label("Concurrency", systemImage: "timelapse")}.tag(TabValue.concurrency)AnimSubView(title: "Persistence topic", bgColor: .blue.opacity(0.3), isMoveFromLeading: moveFromLeading).tabItem {Label("Persistence", systemImage: "swiftdata")}.tag(TabValue.persistence)AnimSubView(title: "Search the site", bgColor: .cyan, isMoveFromLeading: moveFromLeading).tabItem {Label("Search", systemImage: "magnifyingglass")}.tag(TabValue.search)}.safeAreaInset(edge: .bottom) {Text("当前选中:\(tabSelecting)").font(.title2.weight(.heavy)).foregroundStyle(.white.gradient).padding().background(RoundedRectangle(cornerRadius: 15).foregroundStyle(.mint.gradient)).shadow(radius: 3.0)}.safeAreaPadding(.bottom, hSize == .compact ? 100 : 0).onChange(of: tabSelecting) {old,new in// 为标签切换增加转场动画支持...}.tint(.pink)}
}

可以看到:在 TabView 中我们使用 tabItem() 和 tag() 修改器用来构建每一个标签页。

而在新的 iPadOS 18 和 iOS 18 中,我们彻底抛弃了这两个修改器而改为使用 Tab 和 TabSection 视图来描述每个标签页:

struct ContentView: View {@State var moveFromLeading = truevar body: some View {TabView {Tab("Main", systemImage: "house") {AnimSubView(title: "Main", bgColor: .white, imageName: "main", isMoveFromLeading: moveFromLeading)}TabSection("Blog") {Tab("All topics", systemImage: "pencil") {AnimSubView(title: "This is the blog page", bgColor: .yellow, isMoveFromLeading: moveFromLeading)}Tab("SwiftUI", systemImage: "swift") {AnimSubView(title: "SwiftUI topic", bgColor: .purple.opacity(0.3), isMoveFromLeading: moveFromLeading)}Tab("Concurrency", systemImage: "timelapse") {AnimSubView(title: "Concurrency topic", bgColor: .green, isMoveFromLeading: moveFromLeading)}Tab("Persistence", systemImage: "swiftdata") {AnimSubView(title: "Persistence topic", bgColor: .blue.opacity(0.3), isMoveFromLeading: moveFromLeading)}}// 更多的 TabSectionsTab(role: .search) {AnimSubView(title: "Search the site", bgColor: .cyan, isMoveFromLeading: moveFromLeading)}}.tint(.pink)}
}

小伙伴们可以留意一下,在上面的代码中我们是如何使用 TabSection 将若干 Tab 聚合成组的。

运行可以看到,原本底部的标签栏化身为悬浮条一跃横空出世了:

在这里插入图片描述

要想让标签栏进一步支持 Sidebar 切换显示,我们只需将 .sidebarAdaptable 样式应用在 TabView 上即可:

TabView {...
}
.tabViewStyle(.sidebarAdaptable)

在这里插入图片描述


值得注意的是:要想 iOS 18 之前的标签栏旧语法支持悬浮条显示,我们无需修改半行代码。

而只需一行 tabViewStyle(.sidebarAdaptable) 语句的加持,我们也同样可以让旧标签栏支持 Sidebar 样式。


4. 让 Tab 懂你所选

现在我们新的 TabView 已经灵动的“跃然于纸上”了,不过如果我们希望动态跟踪用户选择了哪个 Tab 又该如何是好呢?

在 iOS 18 中使用 tag() 标识标签页的方式已经被废弃,取而代之的是全新的包含 value 参数的 Tag 构造器方法:

在这里插入图片描述

注意该 Tab 构造器必须放在 TabView(selection:) 特定的构造器闭包中才能编译通过。

struct ContentView: View {@Environment(\.horizontalSizeClass) var hSize@State var tabSelecting = TabValue.allTopics@State var moveFromLeading = truevar body: some View {TabView(selection: $tabSelecting) {Tab("Main", systemImage: "house", value: .main) {AnimSubView(title: "Main", bgColor: .white, imageName: "main", isMoveFromLeading: moveFromLeading)}TabSection("Blog") {Tab("All topics", systemImage: "pencil", value: TabValue.allTopics) {AnimSubView(title: "This is the blog page", bgColor: .yellow, isMoveFromLeading: moveFromLeading)}Tab("SwiftUI", systemImage: "swift", value: .swiftUI) {AnimSubView(title: "SwiftUI topic", bgColor: .purple.opacity(0.3), isMoveFromLeading: moveFromLeading)}                Tab("Concurrency", systemImage: "timelapse", value: .concurrency) {AnimSubView(title: "Concurrency topic", bgColor: .green, isMoveFromLeading: moveFromLeading)}Tab("Persistence", systemImage: "swiftdata", value: .persistence) {AnimSubView(title: "Persistence topic", bgColor: .blue.opacity(0.3), isMoveFromLeading: moveFromLeading)}}Tab(value: .search, role: .search) {AnimSubView(title: "Search the site", bgColor: .cyan, isMoveFromLeading: moveFromLeading)}}.tabViewStyle(.sidebarAdaptable).safeAreaInset(edge: .bottom) {Text("当前选中:\(tabSelecting)").font(.title2.weight(.heavy)).foregroundStyle(.white.gradient).padding().background(RoundedRectangle(cornerRadius: 15).foregroundStyle(.mint.gradient)).shadow(radius: 3.0)}.safeAreaPadding(.bottom, hSize == .compact ? 100 : 0).onChange(of: tabSelecting) {old,new in// 标签切换转场动画支持代码从略...}.tint(.pink)}
}

现在,我们已经能够捕获到用户当前选择的标签页啦:

在这里插入图片描述

5. 调整 Tab 的显示位置

除了在 TabView 中用 Tab 和 TabSection 妥善放置各个标签页以外,我们还可以进一步决定它们到底能够在何处显示。

这是通过 tabPlacement() 修改器方法来实现的:

在这里插入图片描述

其中对于 TabPlacement 类型的参数值我们有 3 种选择:

在这里插入图片描述

比如假若我们希望将 TabSection(“Blog”) 内部中间两个 Tab 始终放在悬浮条里,我们可以分别为其调用 .tabPlacement(.pinned) 修改器方法:

TabSection("Blog") {Tab("All topics", systemImage: "pencil", value: TabValue.allTopics) {AnimSubView(title: "This is the blog page", bgColor: .yellow, isMoveFromLeading: moveFromLeading)}Tab("SwiftUI", systemImage: "swift", value: .swiftUI) {AnimSubView(title: "SwiftUI topic", bgColor: .purple.opacity(0.3), isMoveFromLeading: moveFromLeading)}.tabPlacement(.pinned)Tab("Concurrency", systemImage: "timelapse", value: .concurrency) {AnimSubView(title: "Concurrency topic", bgColor: .green, isMoveFromLeading: moveFromLeading)}.tabPlacement(.pinned)Tab("Persistence", systemImage: "swiftdata", value: .persistence) {AnimSubView(title: "Persistence topic", bgColor: .blue.opacity(0.3), isMoveFromLeading: moveFromLeading)}
}

现在,这两个标签项会一如既往的驻留在顶部的悬浮条中,棒棒哒:

在这里插入图片描述

总结

在本篇博文中,我们介绍了 SwiftUI 6.0(iPadOS 18/iOS 18)新标签页中新增的 Tab 和 TabSection 原生视图,并进一步讨论了如何让 TabView 支持 Sidebar 样式以及其它有趣的新特性。

感谢观赏,再会!😎

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

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

相关文章

用AI帮助设计师提升工作效率?

在创意设计的世界里,效率往往意味着灵感与时间的完美结合。设计师们时常面临各种挑战,如何在保证作品质量的同时,又能提升工作效率?这不仅是设计师们思考的问题,也是AI技术正在积极解决的问题。那么,用AI帮…

华为仓颉开发语言“可能”明天正式面世(2024年6月20日写下)

众多迹象表明,鸽了几次的华为仓颉开发语言,有望在2024华为开发者大会上正式面世,你的期待热情是否还在? 1、“仓颉编程语言”公众号面世 最近,华为旗下的公众号“编程语言Lab”悄然改名为“仓颉编程语言”&#xff0c…

MySQL中实现行列转换的示例

在 MySQL 中进行行列转换(即,将某些列转换为行或将某些行转换为列)通常涉及使用条件逻辑和聚合函数。虽然 MySQL 没有像 Oracle/SQL Server 中的 PIVOT 和 UNPIVOT 那样的直接功能,但你可以通过结合 CASE 语句、UNION 或 UNION AL…

汽车信息安全硬件讨论:SE vs HSM

目录 1.什么是Secure Element 2.芯片内置HSM和SE 3.未来HSM的发展 现在的智能网联汽车看起来像是一个连接万物的智能移动终端,它不仅可以与OEM云服务器通信接收OTA推送,还可以与手机蓝牙、Wifi交互完成远程汽车解锁、座舱内环境设置等等,借…

echarts dataZoom用按钮代替鼠标滚轮实现同样效果

2024.06.19今天我学习了echarts dataZoom如何用按钮来控制放大缩小的功能, 效果如下: 通过控制按钮来实现图表放大缩小数据的效果。 步骤如下: 一、写缩放按钮,以及图表数据。 二、设置初始位置的变量,我这边是七个…

爬虫学习。。。。

爬虫的概念: 爬虫是一种自动化信息采集程序或脚本,用于从互联网上抓取信息。 它通过模拟浏览器请求站点的行为,获取资源后分析并提取有用数据,这些数据可以是HTML代码、JSON数据或二进制数据(如图片、视频&#xff09…

【类型转换】C++中char、char*、int、string相互转换函数及string转不同进制数函数

参考资料:cplusplus官方资料strtol 函数用法 总结: 1、这些在做编程题处理输入数据时常用,需要牢记。

打造智能家居:用ESP32轻松实现无线控制与环境监测

ESP32是一款集成了Wi-Fi和蓝牙功能的微控制器,广泛应用于物联网项目。它由Espressif Systems公司开发,具有强大的处理能力和丰富的外设接口。下面我们将详细介绍ESP32的基础功能和引脚功能,并通过具体的实例项目展示其应用。 主要功能 双核处…

XSS+CSRF组合拳

目录 简介 如何进行实战 进入后台创建一个新用户进行接口分析 构造注入代码 寻找XSS漏洞并注入 小结 简介 (案例中将使用cms靶场来进行演示) 在实战中CSRF利用条件十分苛刻,因为我们需要让受害者点击我们的恶意请求不是一件容易的事情…

商业银行数据资产管理体系建设的实践与展望

随着数字经济的快速发展,数据已成为商业银行的核心资产。商业银行在数字化转型过程中,面临如何有效管理和利用海量数据资产的挑战。本文基于《商业银行数据资产管理体系建设实践报告》,探讨浦发银行、IBM和中国信息通信研究院在数据资产管理体…

DVWA - Brute Force

DVWA - Brute Force 等级:low ​ 直接上bp弱口令爆破,设置变量,攻击类型最后一个,payload为用户名、密码简单列表 ​ 直接run,长度排序下,不一样的就是正确的用户名和密码 ​ 另解: 看一下…

NSSCTF-Web题目8

目录 [LitCTF 2023]Http pro max plus 1、题目 2、知识点 3、思路 [NSSCTF 2022 Spring Recruit]babyphp 1、题目 2、知识点 3、思路 [LitCTF 2023]Http pro max plus 1、题目 2、知识点 http数据包头部字段 3、思路 打开题目 第一想法就是加上X-forwarded-for字段 …

一分钟搭建新生录取查询系统

小伙伴们,新学期就要开始了,招生老师们,你们准备好迎接新生了吗?我给老师们分享一个超级实用的小技巧——如何用快速搭建一个新生录取查询系统! 准备好录取名单的电子表格,记得包含“姓名”和“手机号”这样…

可视化大屏:选了浅色系,结果悲剧了

某些时候,有些客户不听劝告,感觉深色系大屏过于压抑,就让用浅色系,结果浅色系投到大屏上,直接亮瞎了。 选择浅色系的可视化大屏可能会存在以下几个问题: 视觉疲劳: 浅色系的颜色相对较亮&…

极限编程里最容易被忽略的实践

在前面的一篇文章里面我和大家聊过了极限编程的重要性,今天想和大家聊聊极限编程里面最简单但也往往最容易被忽略的实践——编码规范。 说到编码规范,每一个开发人员都非常熟悉,每一个团队也都有自己的编码规范。但实际的执行情况如何呢&…

深圳信用贷款之路:申请了10次都被拒!这三步帮你逆袭银行贷款!

贷款客户最头疼的就是明明查询了一堆资料,贷款还是办不下来!尤其是那些负债累累的,急需资金还月供和本金的朋友们,不是在贷款就是在贷款的路上,一个月申请了10次都被拒!去了好几家贷款机构,费用…

数据库开发-MySQL

前言 首先来了解一下什么是数据库。 数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库。 像我们日常访问的电商网站京东,企业内部的管理系统OA、ERP、CRM这类的系统,以及大家每天都会刷的头条、抖音类的app…

文字游侠:一款全新AI写作模型,每天10分钟一键创作爆文!附渠道和玩法教程!

在当今快节奏的社会中,虽然传统的工作可以满足我们基本的物质需求,但许多人内心深处渴望的是更高层次的精神满足。这就像是我们常说的:“工资可以喂饱肚子,副业可以养活灵魂。”这并不是鼓励大家辞去日常工作,而是提倡…

美国铁路客运巨头Amtrak泄漏旅客数据,数据销毁 硬盘销毁 文件销毁

旅客的Guest Rewards常旅客积分账户的个人信息被大量窃取。 美国国家客运铁路公司(Amtrak)近日披露了一起数据泄露事件,旅客的Guest Rewards常旅客积分账户的个人信息被大量窃取。 根据Amtrak向马萨诸塞州提交的泄露通知,5月15日…

.net 6 api 修改URL为小写

我们创建的api项目,url是[Route(“[controller]”)],类似这样子定义的。我们的controller命名是大写字母开头的,显示在url很明显不是很好看(url不区分大小写)。转换方式: var builder WebApplication.Crea…