大多数浏览器和
Developer App 均支持流媒体播放。
-
SwiftUI 中的 SF Symbols
探索如何才能将 SF Symbols 纳入您的 SwiftUI app。我们将探讨符号呈现、大小自定义和不同变体显示的基本方法。我们还将向您介绍符号着色的最新更新功能,并帮助您挑选符合您的 app 需求的工具。
资源
相关视频
WWDC21
-
下载
♪ ♪ 嗨 我是雅各布 欢迎来到“SwiftUI中的SF Symbols” 我们将在本环节中探讨几个主题 首先是通过SwiftUI 使用SF Symbols的一些基础知识 接着是如何使用符号的变量 最后则是运用全新的渲染模式 关于这些API的可用性有一个小提醒 本环节中看到的所有内容 都能在所有Apple平台上取得 并请留意New徽标来了解 哪些项目在今年的版本属于新内容 让我们开始介绍基础知识吧 如果您已通过SwiftUI使用过SF Symbols 这部分对您而言应该是小事一桩
作为开头 我们直接展示一个符号吧
最简单的方式 是使用系统提供的其中一个符号 例如以图像呈现的“爱心” 标签视图是另一个 显示符号的主要方法 标签是标题和图标的组合 而图标经常都是一个符号 标签的优点在于 它是这个组合的一般描述 并会随着组合所显示的环境 来调整其行为 例如 在许多组件中 标签会和符号与标题一起显示 有时候它们会以不同的布局显示 或者 有时组件仅会显示 符号或仅显示标题 SwiftUI会在内建视图中 自动为您进行这些变更 也可以在自己的视图中 使用标签样式来变更 直接变更使用的初始化表达式 即可在图像和标签中显示自定义符号 画面上是各个设定的样子 但是视觉表示法并非唯一的重点 这是每个视图 在旁白当中默认显示的样子 您可看到使用标签 会自动提供强大的辅助功能支持 因为标题提供了内容的 文字描述 让我们进一步了解只有图像的案例 可能的话 SwiftUI将根据 系统符号的内容来提供标签 这可能就是您所需的一切 例如当您使用爱心制作“喜爱”的按钮 然而 有些符号没有标准意义 在这些情况下 预设的辅助使用描述 便不如往常实用 您也可新增更多特定信息 关于您的应用程序使用符号的方法 随时使用accessibilityLabel 即可提供该信息 自定义符号是另一个案例 让我们无法取得理想的辅助使用描述 有一个好方法可以改善这点 那就是 在Localizable.strings文件中 提供本地化的图像名称 SwiftUI会针对任何使用 此图像accessibilityLabel的位置 自动使用可本地化的字符串
最后一个使用符号的方法 则是作为文字的一部分 您可以使用字符串内插 在文字执行里嵌入符号 这是个很好的技术 可用于您要符号与文字 自动重排的情况 就像这个V形符号
让我们回到“爱心”的标签 看看一些我们可以 套用到符号的修饰符来进行自定义 先从通过foregroundStyle修饰符 来变更符号色彩开始吧 文字和符号要默认为黑色或白色 以浅色模式或深色模式显示 您可以将foregroundStyle 设定为特定颜色 像是红色 或是更加语义化的值 例如目前的tint或secondary样式 我们稍后 会再回到foregroundStyle 了解通过此功能 所能产生的进阶效果
您可以使用font修饰符变更文字大小 以及符号大小 若使用文字样式 如body或caption 文字和符号便会随动态字体而自动缩放 若选择固定字号 它们则会维持一致
您还可以变更符号的缩放比例 使用imageScale修饰符即可进行缩放 这不会改变文本的字体大小 而是符号与文字相比之下显示的大小
接着 我们来看看变量 您可能已注意到iOS标签栏 应使用填充风格的符号变量 以前 这步骤需要由您亲自 从Symbols app 小心地选择正确的符号 并需留意符号是否提供了fill变量 就像此处的“sparkles” 从今年开始 标签栏和其他视图 已自动加入特定变量 例如fill 以套用至其中包含的任何符号 这表示您可直接使用符号的基础版本 来实现正确变量 而无须额外的工作 而且 无需过度指定您要的确切设定 您就能获得更具复用性的程序代码 举例来说 假设我们在macOS上执行相同程序代码 便能为该平台取得正确的变量 也就是线框风格
我们也可以在自己的组件中 使用此变量支持 画面上是一个简单的标签列表 显示了默认的线框风格变量 为了在此使用填充风格变量 我可以用新的symbolVariant修饰符 这个修饰符会设定环境中的指定变量 非常适合用于整个视图层级 就如我们现在做的 我们提供了大量的变量 fill、slash和一组形状封装 这些也可以和彼此相互结合 和在符号名称里的 结合方法一样 例如.circle.fill
同一组变量也可用于自定义符号 您只需要遵循系统符号 使用的命名模式即可 接着 我们来看看渲染模式 Symbols支持四种不同的渲染模式 可让您自定义符号着色的方式 以下是各个渲染模式的一些范例 我们将逐一介绍 如果您希望了解更多 不同渲染模式设计的信息 我非常建议您观看 “SF Symbols中的新增功能”
好的 让我们回到卡片列表 这次是以macOS为例 现在 我们的符号显示的是默认渲染模式 也就是单色 这很适合用于为一组符号 显示一致的颜色 然而 本案例中 我想要使用 与各个卡片关联的色彩 来显示这些符号 多色渲染模式是很好的方法 可显示 各个符号呈现的颜色 只要在symbolRenderingMode修饰符 添加multicolor 即可变更至多色模式 如果符号没有multicolor表示法 该符号便会回到单色渲染模式 您可以使用SF Symbols app 查询哪些符号具有多色定义 并将多色支持添加至自定义符号 观看“SF Symbols App概述” 以了解更多信息 这个App的另一个部分有一些按钮 可以将卡片随机显示于不同花色 我要通过不同层次的不透明度 来强调这些符号的关键部分 您还记得 哪一个渲染模式可以做到这点吗? 没错 就是分层 我们可以将相同的 symbolRenderingMode修饰符 用于分层模式 这会使用当前的前景样式 将单一色彩套用至符号 如同单色模式 同时还会新增多重层次的不透明度 来强调符号的关键元素 而最后一个渲染模式 我的app里 有一个可以提供帮助的按钮 我不是很擅长卡片游戏 所以我需要这个按钮来复原我的错误 画面上显示了带有符号的按钮 以及.circle.fill变量 来获得这个圆形背景 但是色彩和我希望的不太相符 我想要和卡片更匹配的色彩 记住 我们可以使用 foregroundStyle修饰符 设定符号色彩 但我们还可以进行其他设定 从今年开始 我们可以设定多重色彩 来为我们的符号着色 通过使用调色渲染模式 可让您最大程度地控制 符号图层的着色 您可以指定最多三个样式 来控制符号的每个层次 这个符号有主要和第三级的内容 因此系统会使用第一和第三个色彩 如果我们使用的符号 只有主要和次要内容 就像这个符号的线框版本 那么系统只会使用那些色彩 因为大部分的单一符号 仅会使用两个图层 就像这两个一样 您可以指定两个样式 而不指定三个 最后一个样式便会用于 所有次要以上的内容 在许多案例中 您只需要用到这些 我们目前为止都在使用色彩 但是这是前景样式修饰符 它可以和任何形状样式一起使用 我们可以使用次要样式 在模糊背景前制造鲜明的效果 甚至可以使用材质来模糊符号 后方的背景 若想了解更多关于前景样式和材质 请观看“将丰富图形 新增至您的SwiftUI app” 让我们再次回顾整个系列的渲染模式
了解并选择该使用 哪一个渲染模式的最佳办法是 使用SF Symbols app和其样式检查器 这些用来在SwiftUI中表现设定的API 具有相同的运作方式 因此可以轻松在Symbols app 和程序代码间切换 您还可以通过最少量的设置 来获得最佳的行为 若您只有一个前景样式 且未指定渲染模式 系统会自动选择单色模式 若您指定超过一个前景样式 但未指定渲染模式 系统会自动选择调色模式
Symbols app提供了大量的色彩 可和不同的渲染模式一起使用 这整组色彩也都可在SwiftUI中使用 包含今年新内容中的 数个色彩和样式 这些色彩已针对 它们所出现的不同设定进行优化 不论是浅色和深色模式 模糊背景上的特殊渲染 甚至是它们所出现的特定平台 我们刚刚已了解如何建立符号 变更外观的一系列修饰词 如何变更显示的符号变量 选择不同渲染模式 以及如何使用前景样式 自定义您的符号着色 SF Symbols可让您 轻松地将漂亮的图形添加至app 并按照您的需求自定义 快来了解可以在何处采用符号 让您的app更加美观 谢谢您的收看 希望您有个愉快的WWDC体验 [欢快的音乐]
-
-
0:45 - Creating Symbols
// System symbol image Image(systemName: "heart") // System symbol label Label("Heart", systemImage: "heart") // Custom symbol image Image("queen.heart") // Custom symbol label Label("Queen of Hearts", image: "queen.heart")
-
2:33 - Accessibility Label
Image(systemName: "heart") .accessibilityLabel("Ace of Hearts") Image(systemName: "person.circle") .accessibilityLabel("Profile") Image("queen.heart") // Localizeable.strings "queen.heart" = "Queen of Hearts";
-
2:59 - Symbol in Text
Text(""" Thalia, Paul, and 3 others \(Image(systemName: "chevron.forward")) """)
-
3:14 - Customizing Color
Label("Heart", systemImage: "heart") Label("Heart", systemImage: "heart") .foregroundStyle(.red) Label("Heart", systemImage: "heart") .foregroundStyle(.tint) Label("Heart", systemImage: "heart") .foregroundStyle(.secondary)
-
3:51 - Customizing Font
Label("Heart", systemImage: "heart") .font(.body) Label("Heart", systemImage: "heart") .font(.caption) Label("Heart", systemImage: "heart") .font(.system(size: 10))
-
4:08 - Customizing Scale
Label("Heart", systemImage: "heart") .imageScale(.large) Label("Heart", systemImage: "heart") .imageScale(.medium) Label("Heart", systemImage: "heart") .imageScale(.small)
-
4:23 - Customizing Variants
TabView { Text("Cards").tabItem { Label("Cards", systemImage: "rectangle.portrait.on.rectangle.portrait") } Text("Rules").tabItem { Label("Rules", systemImage: "character.book.closed") } Text("Profile").tabItem { Label("Profile", systemImage: "person.circle") } Text("Magic").tabItem { Label("Magic", systemImage: "sparkles") } }
-
5:12 - Monochrome
List { Label("Ace of Hearts", systemImage: "suit.heart") Label("Ace of Spades", systemImage: "suit.spade") Label("Ace of Diamonds", systemImage: "suit.diamond") Label("Ace of Clubs", systemImage: "suit.club") Label("Queen of Hearts", image: "queen.heart") } .symbolVariant(.fill)
-
6:41 - Multicolor
List { Label("Ace of Hearts", systemImage: "suit.heart") Label("Ace of Spades", systemImage: "suit.spade") Label("Ace of Diamonds", systemImage: "suit.diamond") Label("Ace of Clubs", systemImage: "suit.club") Label("Queen of Hearts", image: "queen.heart") } .symbolVariant(.fill) .symbolRenderingMode(.multicolor)
-
7:10 - Hierarchical Rendering Mode
HStack { Button(action: {}) { Image(systemName: "square.3.stack.3d.top.fill") } Button(action: {}) { Image(systemName: "square.3.stack.3d.bottom.fill") } } .symbolRenderingMode(.hierarchical)
-
7:50 - Palette Rendering Mode
Button(action: {}) { Image(systemName: "arrow.uturn.backward") } .symbolVariant(.circle.fill) .foregroundStyle(.white, .yellow, .red)
-
9:00 - Advanced Foreground Styles
Button(action: {}) { Image(systemName: "arrow.uturn.backward") } .symbolVariant(.circle.fill) .foregroundStyle(.white, .red) Button(action: {}) { Image(systemName: "arrow.uturn.backward") } .symbolVariant(.circle.fill) .foregroundStyle(.white, .secondary) Button(action: {}) { Image(systemName: "arrow.uturn.backward") } .symbolVariant(.circle.fill) .foregroundStyle(.red, .regularMaterial)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。