WWDC20 10041 - What's new in SwiftUI

本文知识目录

知识点问题梳理

这里罗列了四个问题用来考察你是否已经掌握了这篇文章,如果没有建议你加入 收藏 再次阅读:

  1. 都有哪些协议遵循 Scene,它们都有哪些功能和使用场景 ?

  2. 说说 toolbar 有哪些构造方法 ?

  3. 本文提到了哪些新增加的视图 ?

  4. 本文提到了新增加了哪些与系统交互的功能 ?

引子

对于 iOS 开发而言, WWDC 2019 中推出的 SwiftUI 无疑是最受关注的一项技术,它可以在所有 Apple 平台上构建出色的用户界面。而今年我们迎来了 SwiftUI 2.0,让我一起来看看 SwiftUI 有哪些新增功能。

今年有很多新 feature,且数量远超出我们一次演讲所能涵盖的范围,但是我们将尽力涵盖尽可能多的内容。同时我们也会介绍相关的 Session,大家可以查看这些 Session 以了解更多信息。

Apps and Widgets

让我们从 Apps 和 Widgets 开始。

这是苹果第一次仅使用 SwiftUI 来构建整个应用程序,而不是将 SwiftUI 代码嵌入 UIKitAppKitWatchKit 应用程序中。

我们来写一个简单的 Hello World! 应用。

你没有看错,这是 100%正常运行的应用程序。

App & Scene

SwiftUI 将大量智能,自动以及可自定义的行为统统打包到了简单灵活的声明式 API 中。

我们先来展示一个用于跟踪正在阅读书籍进度的应用程序。

在底部,有一个自定义视图来表示应用程序的主用户界面,而顶部使用该视图作为应用程序主窗口的内容。

首先要注意的是这两个声明的相似之处。我们都定义了一个遵循 protocol 的结构。

我们设计了 SwiftUI 的新 App API,以遵循您在视图代码中已经习惯的声明式的 State-Driven 模式。App protocl 使我们能够轻松地用一个结构来替换 AppDelegateSceneDelegate,该结构将管理我们的场景和应用生命周期。

另一个关键点在于 body 属性的返回类型。这里返回的 Scene 也是 SwiftUI 中的一个新概念,它表示界面可以由不同的平台独立显示。

WindowGroup

WindowGroupScence 的具体应用之一,它是 SwiftUI 中 Scene 如何提供现成的智能,多平台功能的有力示例。

在我们的 iOS 应用中,WindowGroup 正在为我们的应用创建和管理单个全屏窗口。相同的代码也可在 watchOS 上运行,还可以管理单个全屏窗口。

尽管这两应用看起来有所不同,但是两个平台上的核心应用结构相同,因此它们可以共享一个应用声明。

实际上,我的应用程序也可以在 tvOS 和 iPadOS 上运行。

由于 iPadOS 支持多窗口应用程序,因此我们免费获得了一些附加功能;就像能够创建可以并排显示的应用程序的多个实例。

这也扩展到了 macOS,它也支持多个窗口。我们可以使用标准的 Command-N 快捷方式创建新窗口,并将它们收集到单个选项卡式窗口中。SwiftUI 甚至会自动将 “新窗口” 菜单命令添加到我的主菜单中。

SwiftUI 还支持其他类型的场景,这些场景可以像视图一样组合在一起,构建出更复杂的应用程序。

就像 macOS 上新增的 “设置” 场景一样,“偏好设置” 窗口的添加也很简单。

设置场景将自动在应用程序菜单中设置标准的 “首选项” 命令,并为窗口提供正确的样式处理。

DocumentGroup

SwiftUI 的 Scene API 还支持基于文档的应用程序,例如我们为绘制矢量形状而构建的该应用程序。

新增的 DocumentGroup 场景,它可以自动管理 iOS,iPadOS 和 macOS 支持的,基于文档的场景的打开,编辑和保存。

在 iOS 和 iPadOS 上,如果未提供其他主界面,DocumentGroup 将自动显示文档浏览器。

在 Mac 上,DocumentGroup 将为每个新文档打开一个不同的窗口,并自动将命令添加到主菜单中以执行常见的文档操作。

说到菜单命令,SwiftUI 允许您使用新的 .commands 修饰符添加其他命令。

例如,在这里我们添加了一个自定义形状菜单,用于向画布添加新形状。macOS 将在主菜单的正确区域中自动添加自定义菜单,并显示其键盘快捷键。这些快捷键是我们使用新的 .keyboardShortcut 视图修饰符分配的。

.commands API 所提供的功能比我们在此处显示的功能要多得多,例如能够基于用户焦点来定位命令等等。

Xcode Support

为了帮助您构建这些新应用,我们还添加专门用于 SwiftUI 应用的新的 Multiplatform 模板,更新了 Xcode 中的新项目体验。

这些新模板针对多平台代码进行了优化,可自动为共享代码以及特定于平台的组件和资源。

另一部分是如何配置应用程序的 LaunchScreen

infp.plist 中新增的 “LaunchScreen” key,可以声明启动屏幕组件的各种组合。例如默认图像,背景色以及顶部和底部的空白栏(如上图配置的)。

如果在现有项目中已经使用了 Storyboard,仍然可以正常工作无需更换。不过对于新的 SwiftUI 项目,LaunchScreen 配置是一种简单的选择。

SwiftUI App Sessions

关于 SwiftUI Apps 我们已经准备了演讲,以更深入地介绍什么是场景以及它们与应用程序和视图的关系:

  • App essentials in SwiftUI[1] - 带你解释了视图,场景和应用程序如何更深入地协同工作。

  • Build document-based apps in SwiftUI[2] - 将深入研究了如何在应用程序中打开和管理文档。

Widgets

现在让我们简单谈谈 Widgets ,这是 iOS,iPadOS 和 macOS 上的新作之一。Widget 只能使用 SwiftUI 来构建的。它直接将 Swift 语言和 SwiftUI 的重要程度提升了一大截。

我们可以使用符合 Widget protocol 的自定义结构来构建 Apps 和 View 一样的 Widget。

我们可以制作许多种类型的 Widget,例如这种会定期向我推荐新专辑的 Widget。

Widget 也可以配置其他类型的数据,例如 Siri Intents。

关于构建 Widget,有很多要讨论的内容,并且我们有一些讲座可以帮助你入门:

  • Design great widgets[3]

  • Meet WidgetKit[4]

  • What's new in SwiftUI[5]

  • Widgets Code-along, part 1: The adventure begins[6]

  • Widgets Code-along, part 2: Alternate timelines[7]

  • Widgets Code-along, part 3: Advancing timelines[8]

建议先观看 Build SwiftUI views for widgets[9] 以了解更多信息。

Widgets in watchOS

我们现在可以使用 SwiftUI 为 Apple Watch 构建复杂的自定义功能。可以像我制作的本周咖啡图表那样构建全彩色功能。

关于构建复杂的 watch 应用可参考如下 Sessions:

  • Build complications in SwiftUI[10]

  • Create complications for Apple Watch[11]

Lists and Collections

接下来,让我们讨论对 Lists 和 Collections 的改进。列表是许多应用程序的重要组成部分,通常代表用户与之交互的主要界面。在此版本中,Lists 获得了一些很棒的新功能。

Outlines

使用 outlines,我们只要简单声明具有动态性、数据驱动的内容就可完成常规列表的展示。

还可以在初始化时提供 .chldren 的 KeyPath,来实现列表的嵌套显示。

默认情况下,Lists 使用 macOS,iOS 和 iPadOS 上的系统标准样式来显示。

我们希望通过易用性的 outlines 可以帮助和减少偏内容的应用程序对于 push-pop 导航栏模式的滥用。

Grids

去年 SwiftUI 被人诟病最多的恐怕是对列表和网格的支持不友好。当我们有数百或上千个 Views 存在于 GridsStacks 中时,SwiftUI 可是会直接初始化并创建它们,这可是非常 ???? 的事情。

好在今年,SwiftUI 增加了对网格布局的 Lazy-Loading,可以将其与 ScrollViews 组合来实现网格内容的平滑滚动。

网格具有强大布局功能,支持多种配置,例如调整列数以适应可用空间,就像我们在此处看到的横向和纵向一样。

或强制固定数量的列,每个列都可以具有自己的大小调整参数,例如下面示例,每列固定为 4 栏。

当然,SwiftUI 也支持水平滚动的网格。除此之外,我们还提供了 VStackHStackLazy-Loading 版本,这些版本非常适合构建自定义的可滚动布局。

例如,这个图像瀑布流的展示:

我们使用 LazyVStack 作为容器,同时利用 ViewBuilder 新增的 switch 控制功能,轻松支持图片的各种布局。例如顶部的单个大图,中间的多个小尺寸图片的不对称组合等。这些组件一起组合成一个无缝的图片流。

在本文中,我们只是简单介绍了部分功能。还有更多新增的 View,比如 ScrollViewReaderTextEditor 等等。想要了解更多 SwfitUI 的 Lists 和 Grids 的强大功能,请查看 Stacks, Grids, and Outlines in SwiftUI[12].

Toolbars and Controls

现在,让我们跳到 SwiftUI 对 toolbar 的支持以及自定义控件的新方法。

Toolbar

从 macOS Big Sur 中漂亮的外观到更新的 iPad 系统体验,再到 watchOS 上的 primary actions。今年,我们可使用 SwiftUI 新增的 .toolbar 修饰符构造所有这些 API:

// Toolbar
BookList().toolbar { // #1Button(action: .recordProgress) {Label("Record Progress", systemImage: "book.circle")}}BookList().toolbar { // #2 和 #1 是同等效果ToolbarItem(placement: .primaryAction) {Button(action: recordProgress) {Label("Record Progress", systemImage: "book.circle")}}}BookList().toolbar { // #3ToolbarItem(placement: .confirmationAction) {Button("Save", action: saveProgress)}ToolbarItem(placement: .cancellationAction) {}Button("Cacnel", action: dismissSheet)}}
BooDetail().toolbar { // #4ToolbarItem {Button(action: recordProgress) {Label("Progress", systemImage: "book.circle")}}ToolbarItem(placement: .bottomBar)Button(action: .shareBook) {Label("Share", systemImage: "square.and.arrow.up")}}}

上述代码的效果如下:

上面代码列出了构造一个 toolbar 的多种方式。toolbar items 与 SwiftUI 中的其他视图组成基本相同,在上面的几个例子中,均由 button 实现的。

另一个示例是 principal 语义的使用,它将在应用程序的突出位置中显示,就像我们下面看到的:

toolbar 默认会放置在我们熟悉的位置,也可以通过使用 toolbar 进行显式自定义。

我们只需在 SwiftUI 描述这些 toolbar item 的状态,然后 SwiftUI 会根据语义的定义自动找出正确的位置。例如,wathcOS 中的确认和取消操作就会置顶显示。

我们也可以指定放置的位置来进行额外的控制,尤其是对于相对较小的屏幕。例如,在 iOS 中通过指定分享 item 的 .bottomBar 位置等。

Label

在上面的示例代码中,你应该发现了 SwiftUI 中 Label 视图的新用法:

Label {Text("Progress")
} icon: {Image(systemName: "book.circle")
}

Label 现在可以是 TextImage 的组合,我们不仅可以使用国际化的 Key 来配置不同语言的标题,还能利用 system imageSF Symbol 来设置图标。想了解更多 SF Symbol 2.0 请访问 Session - 10207[13]

对于前面的 toolbar 的示例,Label 默认仅会在按钮上显示出图标,而文本则用于辅助的目的。这一行为同样作用于 menu list

Label List

我们的 Label 支持以列表展示啦。无论图标大小如何,本文都完美对齐,并且对于不同大小的的动态类型字体,Label 也能发挥作用。来看一段代码:

List {Label("Intruduction to SwiftUI",systemImage: "hand.wawve")Label("SwiftUI Essentials",systemImage: "handstudentdesk")Label("Data Essentials to SwiftUI",systemImage: "flowchart")
}

Label 默认以 large 尺寸的布局展示。当更改为 extraLarge 时,图标和标题都会自动更新,而且能很好地重排文本和增加列表行。当然,还支持可以更大尺寸的 accessibilityLarge

对于更大的字体,Label 会更新为文字环绕,以最大程度地增加可见文字的数量。

对比效果如下:

Help

现在,随着 toolbar 之类具有干净的仅图标样式的标签元素,为这些元素提供额外的帮助比以往任何时候都更加重要。

使用新的 .help 修饰符,可以附加控件的作用说明,并在 macOS 上显示为工具提示。

同样,此修饰符可在所有平台上使用,因为它还提供了可访问性提示,可为您的应用程序在任何地方提供更好的 VoiceOver 体验。

New Views

ProgressView

SwiftUI 现在支持 ProgressView 了,它不仅支持线性样式,还带来了环形样式。

ProgressView("Downloading Photo", value: percentComplet).progressViewStyle(CircularProgressViewStyle(tint: .blue))

Gauges

对于 watchOS 7+ 现在可以在 SwiftUI 获取仪表盘视图了。

对于 Guage 视图,我们可以对 minimum 和 maximum 值进行可选设置来控制是否显示。

New Effetct and Styling

接下来,让我们看一下使用 SwiftUI 来制作一些炫酷的效果。

HoverEffect

macOS Big Sur 对 Notification Center 和菜单栏中的新 Control Center 均使用 SwiftUI 重写,同时 Control Center 使用了 SwiftUI 中的一项动效,实现了其在不同模块间平滑切换。

接下来,我们构建了一个 UI 原型来展示该效果的使用。

这里以收集喜欢专辑的功能来展示,它由相册的 LazyGridselectdAlbumRow 组成。只需为每个按钮添加 matchedGeometryEffect 并绑定上每个专辑的 ID 和相对的 NameSpace。这样当我们选择喜欢的专辑后,它会从网格中流畅地过渡到底部我们喜欢的专辑那一行。

除了这个配预设效果之外,我们也可以通过提供的 API 配置自定义动画:

Styling

SwiftUI 也新增了很多方便的样式修改功能。

ContainerRelativeShape

我们从专辑的 widget 中可以看到,新增的 ContainerRelativeShape 将采用最接近所包含内容的形状来生成相似的路径。

它有效的将该外部容器的形状进行偏移,并根据其偏移量自动保持与内容形状的同心度。

还有一些其他改善和增强文本元素体验的效果等。

Dynamic Type Scaling

现在在 SwiftUI 中,图像可以作为文本的一部分嵌入其中,并且作为统一的整理来响应动态的变化。

这里其实是通过一个新的属性包装器 ScaledMetric,来描述自定义的非文本度量标准 (例如布局) ScaledMetric 会根据当前的基准值来自动缩放尺寸。

// Dynamic Type Scaling
@ScaledMetric private var padding: CGFloat = 10.0
VStack {Text(albmu.nmae).font(.custom("AvenirNext-Regular", size: 30))Text("\(Image(systemName: "music.mic")) \(album.artist)").font(.custom("AvenirNext-Regular", size: 17))
}
.padding(padding)
.background(...)

缩放效果如下:

总之,通过这些使得基于响应式的自定义布局变得很容易,同时又具有良好的表现。当然,我们能做的不止于此,即使是系统控件,也能随心所欲的自定义它们的样式。

哦,对了。颜色也是同样可以自定义的。

List Item Tinting

最后再介绍一个列表元素的 tineColor,现在我们可以针对不同的 item 轻松配置不同的 tintingColor。

List {Section {Label("Menu", systemImage: "list.bullet")Label("Menu", systemImage: "heart").listItemTine(.red)Label("Menu", systemImage: "seal").listItemTine(.purple)}Section(header: Text("Recipes")) {... }.listItemTine(.monochrome)
}

对比效果:

System Integration

最后一节,来简单聊一聊,SwiftUI 与系统的深度集成。

链接跳转

通过新提供的 Link View,URLs 跳转现在也是 SwiftUI 中的一等公民了。它默认会使用浏览器打开链接。

同样,应用间的 Universal Link 跳转也支持啦,可以通过 openURL 来实现不同应用程序的访问。

除此之外,还有包括 Drag and DropUniform Type Identifiers frameworksSign In With Apple 等各种功能等,就不一一介绍了。

总结

很高兴看到 SwiftUI 的下一个迭代是如此强大和丰富的功能。

  • 通过提供更加简洁易用的 protocol,如 AppScene 使得基于 SwiftUI 来构建应用程序变为了可能。

  • 通过全新的 Widget API 的支持,使得 SwfitUI 从一个简单玩具模型提升到可以成为实用工具的一部分。

  • 随着各种新的视图的出现、功能的完善和性能的提升,SwiftUI 将具有无限想象力,或许不久的将来会直接替代 storyboard 并且成为可视化编程的中流砥柱 ????。


你觉得 SwiftUI 是未来吗?

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

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

相关文章

“脱离”现实+极致拟真?声网凤鸣AI引擎来袭

3月23日,实时互动云服务商声网在北京举办“凤鸣AI引擎”发布会,正式发布了囊括 AI降噪、AI回声消除、空间音频、最佳音效在内的声网新一代音频技术智能引擎。开发者与企业可以如搭积木般灵活调用对应组件,并广泛应用在语聊社交、在线K歌、线上…

英特尔发布酷睿系列 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 1 月 5 日,在 2003 年的今天,“神舟”四号飞船在完成预定空间科学和技术试验任务后,在内蒙古中部地区准确着陆。至此&#x…

【English】《trancy,一个用chatgpt翻译视频的神器,强烈推荐!》- 知识点目录

《trancy,一个用chatgpt翻译视频的神器,强烈推荐!》 应用名称: Trancy1. 支持网站 YouTube和Netflix 2. 安装步骤 Note: 如果安装之后,发现无法点击【知道了】的情况,将网页缩放之后,就可以…

chatgpt赋能python:如何下载Python以前的版本

如何下载Python以前的版本 Python被广泛使用,包括网页开发、机器学习、科学计算等各种领域。然而,最新版本的Python可能与你的应用程序或软件包不兼容,因此你可能需要下载以前的版本来满足你的需求。 本文将介绍如何下载Python以前的版本&a…

chatgpt赋能python:如何下载Python的旧版本

如何下载Python的旧版本 Python是一种流行的编程语言,具有强大的功能和良好的可读性。然而,当需要在旧的或特定的环境中使用Python时,新版本并不总是可行的。在这种情况下,下载旧版本的Python是唯一的选择。本文将介绍如何下载Py…

最新版PC微信(3.9.2.23)逆向——收消息hook

处女作,有写错的地方,请各路大佬明确指出。 逆向分析方法: WeChatWin模块基址:0x5CD60000 a、不停的向测试号发送消息,不要点开,让未读消息总数不断增加(此方法比搜特征码、字符串更通用&#…

pytorch下载与安装(离线包版本)

笔者因为实验需要,不同的模型需要不同版本版本的pytorch,于是安装pytorch就总是出现一个问题,那就是断。比如需要安装torch1.4版本,使用Anaconda Prompt尝试了几次: pip install torch1.4.0 torchvision0.5.0 -f http…

离线安装PostgreSQL数据库(v13.4版本)

记录:328 场景:在CentOS 7.9操作系统上,离线安装PostgreSQL数据库,版本:v13.4。主要是PostgreSQL的编译、安装、启动、登录、设置远程可登录、创建数据库、创建数据库用户等。 版本: 操作系统&#xff1…

regex101 离线版本

regex101.com是一个在线测试正则表达式的网站,比较赞的地方是右边会显示对应正则各个部分的意思,用来调试和学习都是非常好的。还部分支持中文。 但是因为网络不稳定,为了方便研究和学习,我把这个网页的大部分代码拷贝下来&…

飞秋软件--局域网内离线传输文件及聊天工具

下载地址: 链接:https://pan.baidu.com/s/1ADDsXHA4DXtT9zNsF5Eyqw 提取码:o84g 双击安装,按要求,选择安装目录及数据存储目录。一步步安装就行,这里很简单,安装后会在桌面生成…

纪念QT可直接安装的离线版最后版本5.14.2

为什么说纪念呢?因为,这个版本之后再也没有可下载下来安装的版本了,因为我们以后再也没有这么方便了。为是很么说纪念呢?因为我们从QT还很柔弱的时候开始就是使用的离线版。 以前用c#来做组态,自定义控件开发起来也还…

Ubuntu 20.04.5离线安装

1、下载ubantu镜像 Get Ubuntu Server | Download | Ubuntu 2、运行ubantu镜像 通过Vmware运行镜像,这里就不说了。 3、离线安装java服务需要的依赖gcc 以及make 下载gcc以及make的离线安装包 gcc 链接: https://pan.baidu.com/s/1SvMqbz_zfvglUB4ZScW5_Q 提取…

chatgpt赋能Python-python_nmi

Python NMI介绍 Python NMI是一种常见的算法评估指标,用于比较两个或多个聚类结果之间的相似度。NMI全称为归一化互信息(Normalized Mutual Information)。在本文中,我们将介绍Python NMI的定义和用途,并使用示例说明…

代码实践:基于LSTM网络的DEAP情感数据集情感分类

2023/4/5 -4/17 脑机接口学习内容一览: 这一篇文章主要对DEAP数据集转化为python可以处理的格式,并且进一步使用LSTM网络进行分类工作。 一、数据集分析 详情见于官网:DEAPdataset 若想使用数据集可自行在官网申请下载。 以下是对该数据集的简…

员工错误使用 ChatGPT,三星机密数据外泄

ChatGPT 极大地改变了人们的工作方式,不光是普通的个人用户从中受益,一些大型科技公司也同样认可了这些 AI 工具的作用,来帮助其员工提高生产力。 虽然 ChatGPT 确实显著提升了用户的工作效率,但如果员工没有得到充分的提醒和培训…

智能算法系列之模拟退火算法

本博客封面由ChatGPT DALLE 2共同创作而成。 文章目录 前言1. 算法思想2. 细节梳理2.1 超参数的选择2.2 一些trick 3. 算法实现3.1 问题场景3.2 从算法角度分析3.3 python实现 代码仓库:IALib[GitHub] 前言 本篇是智能算法(Python复现)专栏的第二篇文章&#xff0c…

chatgpt赋能python:Python做仿真模拟:一种高效、灵活、易用的工具

Python做仿真模拟:一种高效、灵活、易用的工具 介绍 随着计算机技术的不断进步,仿真模拟已成为许多学科研究中不可缺少的工具之一。在许多领域,例如物理、生物、经济等,都需要使用仿真模拟的技术来预测、测试和优化各种系统的行…

ChatGPT常用的指令(prompts)系列六

系列文章目录 内容翻译自:https://github.com/f/awesome-chatgpt-prompts,并加入自己的实践内容 1、 ChatGPT常用的提示语(prompts)系列一 2、 ChatGPT常用的提示语(prompts)系列二 3、 ChatGPT常用的提示语…

企业级ChatGPT开发入门实战直播21课第2课 运行日志及代码解析

企业级ChatGPT开发入门实战直播21课第2课 运行日志及代码解析 Gavin老师在企业级ChatGPT开发入门实战直播21课第2课中,讲解的ChatGPT应用案例开发架构图: ChatGPT案例运行日志 2023-06-11 16:06:57 DEBUG Calling on_part_begin with no data 2023-06-11

chatgpt赋能python:Python多行注释

Python 多行注释 在 Python 中,我们经常需要写注释来解释代码或者用于调试。Python 的注释分为单行注释和多行注释,本文主要介绍 Python 中如何多行注释。 单行注释 在 Python 中,单行注释以符号 # 开头,可以写在代码的任何位置…