WWDC 2020 Session 10041 - What's new in SwiftUI

发表于 4年以前  | 总阅读数:787 次

本文知识目录

对于 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 和 iPad 上运行。

由于 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 - 带你解释了视图,场景和应用程序如何更深入地协同工作。
  • Build document-based apps in SwiftUI - 将深入研究了如何在应用程序中打开和管理文档。

Widgets

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

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

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

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

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

  • Design great widgets
  • Meet WidgetKit
  • What's new in SwiftUI
  • Widgets Code-along, part 1: The adventure begins
  • Widgets Code-along, part 2: Alternate timelines
  • Widgets Code-along, part 3: Advancing timelines

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

Widgets in watchOS

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

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

  • Build complications in SwiftUI
  • Create complications for Apple Watch

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.

Toolbars and Controls

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

Toolbar

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

// Toolbar
BookList()
    .toolbar { // #1
        Button(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 { // #3
        ToolbarItem(placement: .confirmationAction) { 
            Button("Save", action: saveProgress)
        }
      ToolbarItem(placement: .cancellationAction) {}
            Button("Cacnel", action: dismissSheet)
        }
    }
BooDetail()
    .toolbar { // #4
      ToolbarItem {
         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 项目的状态,然后 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。

对于前面的 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 并且成为可视化编程的中流砥柱 。

本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/uwDTHvfQtsikDDSJyEkVcQ

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237231次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8065次阅读
 目录