大多数浏览器和
Developer App 均支持流媒体播放。
-
UIKit 和 AppKit 中的 SF Symbols
了解如何使用 SF Symbols 3 创建彩色符号并对其进行自定义,以与您的 app 界面的视觉设计匹配。我们将向您介绍用于集成彩色符号的最新 UIKit 和 AppKit API,以及针对实现的最佳实践。为了充分了解本节内容,我们建议观看 WWDC19 的“介绍 SF Symbols”。
资源
相关视频
WWDC21
-
下载
各位好 我是汤姆 欢迎各位观赏 “UIKit与AppKit中的 SF Symbols” 今天由我带各位畅览如何在app中 实现SF Symbols的新功能 首先 我们会先介绍不同的颜色模式 以及如何使用这些模式 接着我们会说明怎么结合配置 获得您想要的效果 最后 我们会在属性字符串中 使用这些彩色符号 你会看到可以用于 AppKit和UIKit的范例 新的API在这两个框架下都一样 因此只要可适用其中一个 另一个也适用 除非是某些框架特定的细微差别 新功能主要着重在 为SF Symbols添加颜色 虽然AppKit 在macOS 11加了多色符号 UIKit则是在iOS 15才加入 今年发布的版本中 会加入 SF Symbols的颜色渲染模式 说明一下 这些渲染模式 在所有平台都能用 为了支持新的渲染模式 符号现在有不同层级 每一层都有不同颜色 这些层级会以分层定义 意思是一层比另一层更显色 这意味着我们有三个分层 第一层 第二层与第三层
在iOS系统 符号需要有模板模式 才能让新的渲染模式产生效果 而在macOS上 套用新的配置 会自动设定正确的模板模式
如果你对SF Symbols不熟悉 请参考 WWDC19的 “介绍SF Symbols” 我们要看的第一个渲染模式 是单色符号 这是语音信箱app 在这个界面中 使用了几个符号 有一个单色符号 还有几个 使用不同颜色模式的其他符号 但是现在先看单色符号 之后再回来讨论其他的
如名称所示 单色符号只会有一个颜色 通常是视图中的着色或强调色 为了实现这个结果 我们创建新的符号图像 将其指派至图像视图 并设定着色 或强调色 以配置符号颜色 这里没有更改任何东西 我们不需要 任何额外的配置来渲染单色符号 因为其为默认行为 所以在iOS 15和macOS 11之前 单色是唯一的渲染模式 若要指定颜色 只需要在图像视图 设定模板或强调色就可以了 我们已经说完原本就有的 单色模式 我们可以来谈谈新模式 分层彩色符号 在Mac上 控制中心使用的图标 正是分层符号的好示例 控制中心有几个地方会使用符号 但是我们先聚焦在显示栏
这里使用了几个符号 中间那一排开关按钮 以及设备清单的图标 设备符号色调比 上方的开关按钮还要淡 这些是分层彩色符号
分层颜色模式 会基于符号的层级为各层上色 你设定的颜色会用于第一层 而第二层和第三层 会使用第一层的颜色变量 不透明度逐渐递减
通过新型的符号配置 可以指定颜色模式 运行方式完全像 符号配置原有的类型 把图像视图的符号配置 设定成这种配置之后 符号会以分层彩色符号显示 分层彩色符号的配色 是以单色打底 再降低其不透明度 而衍生另一个颜色 分层的层级在这里很重要 如果少了一层 就无法使用相关的衍生色
还有第三种颜色渲染模式 调色 接下来会发现 此模式很像 分层渲染模式 但又有点不同 现在回到我们的语音信箱示例 右边的三个钮各有多色 各按钮都有不同颜色 我们要一次一个步骤地构建这些按钮
首先 我们要先用希望的图像 初始化我们的按钮 我们会使用新的按钮配置 可是这些单调的图像 完全不是我们想要的风格 图像应该要是圆形 并且被填充
以前可以通过在符号名称 附加想要的修饰词而做到 但现在有更好的做法 图像变量 如名称所示 使用图像变量时 可以请求图像的不同变量 而不需要手动更改名称 首先 先把我们的图像变成圆形
接着 好好填满这些圆圈
由于我们在按钮容器视图 指定了变量 那些变量 会套用到所有按钮的所有图像 如果图像没有那个变量 就会使用原本指定的图像 变量规范会在视图分层传播 而该分层中的图像视图 接收到之后会施展魔法
有了外型之后 我们要怎么为各符号指定颜色呢? 我们可以创建新的符号配置 指定颜色的调色 这些颜色会套用到与分层颜色配置 相似的分层 但是我们在这里使用的是 明确指定色与衍生色 我们也会使用调色清单中的 新颜色 着色 意思是视图会自动 把着色套用到适当层级
下一个按钮 跟之前的做法完全一样 加载基底图像 建构正确的颜色配置 并套用到按钮配置 这个例子中 看起来跟之前完全一样 但是这里有玄机 我之后会说明
最后一个按钮也是一样的情况 只是颜色不同 跟之前一样 你可能会想 为什么我们这次要明确指定白色 难道不能只使用单色符号 然后正确地调成浅色吗? 答案是不行 不能这么做 这就是我刚才提到的玄机 我们的设计师明确指定这些符号 内件一定都要是白色 直至现在 我们意外得到正确的结果 即使使用单色符号 为什么?因为我们是在浅色模式 可是当我们切换到深色模式 单色符号无法产生我们想要的结果 这是因为单色版本 内件会使用剔除功能 所以背景会从间隙渗出 现在 通过使用调色渲染模式 我们确保这些按钮 在不同用户界面样式下能正确显现
我前面提过一个新颜色 着色 这是UIKit的一个新的动态颜色 可以调整到其使用之图像的着色 明确指定符号层色时 这特别有用 但是你也能 在任何你可以使用其他颜色的地方 使用这个颜色 不过要切记 动态颜色的规则 依然适用
请看WWDC19 “在iOS实施深色模式”的视频 了解更多动态颜色的运行原则 有些符号只有两层 例如 有一堆符号 都没有第二层 遇到这种符号 我们该怎么处理调色模式?
有个好示例是设备符号 这种符号只有第一层和第三层
我们要怎么用两层颜色 帮这个iPad符号上色? 由于符号最多可以有三层 你可以直接明确指定三个颜色 一层一色
这个例子中 没有使用第二色 因为没有第二层 不过面对只有两层的符号时 有另一个方法可以处理 面对这类符号 我们可以在配置中 只指定两个颜色 然后这两色会 依序套用到可用的分层
前面的方法可以 在面对层数不一的符号时 维持 指定调色方式的 一致性 因为颜色直接对应到正确的分层
后面提到的方法则是在 你肯定 符号只有两层时很方便
调色配置 会明确指定一组 套用到该符号分层的颜色 跟分层渲染模式不同 调色渲染模式不会创建衍生色 而与分层渲染模式类似之处 在于各符号层的分层很重要 针对不到三层的符号 还有一个方便的解决方法 这就要进入最后一个渲染模式 多色 我之前有提过这个颜色模式 是去年就加入AppKit和SwiftUI 但是今年才引进UIKit
这类模式有些有多色的图像 这些是多色符号 现在来看看要怎么实现
首先 我们需要加载各单位的图像 目前 这些是一般符号 默认模式是单色模式
接着我们需要表明我们想要多色符号 那就要创建一个配置 请求符号的多色变量 并把这个配置指派到图像视图
但是有一个图标没有改变 它的符号不支持多色 所以要如何得知 哪个符号支持多色呢? 有个简单的方法 是使用SF Symbol app 搜索该符号 然后使用检查器来查看 该符号支持哪个颜色渲染模式 例如 我们的火焰符号只支持单色 但是肺符号四种颜色渲染模式都支持
此外 在这里也能玩一下 各层的颜色图 以更确实感受符号呈现的效果 而不用再写一行代码 现在回到我们的示例
由于不是所有符号都支持多色 我们需要手动把着色设定成正确数值 以让符号正确显示
有些多色符号有浅色层 会受到视图的着色 或强调色影响 没有这一层的符号不会受影响 在我们示例中的符号都不会受影响 所以一切照常
你可能可以从配置的名称中猜到 多色配置代表 偏好符号的多色渲染模式 如我之前所说 并非所有符号都有多色变量 你可以结合一个多色配置 与另一个不同的颜色配置 但是详情之后再提 产生的配置便能支持 两种模式 有多色模式时可支持 没有的话就切换成其他颜色模式 注意 如果结合分层模式和调色模式 会产生最后指定模式 因为它们会一起被排除 如果反过来 该颜色模式不被支持 系统就会使用单色模式
所以 多色符号有固定的颜色组合 不能更动代码 此外 有些符号有一层 可以用着色或强调色渲染的分层 要产生作用 你什么都不用改 符号会在显示时 从图像视图 挑选正确的浅色或强调色
现在 四种颜色模式 以及在代码中如何使用都介绍完了 但是在界面生成器也能这样处理吗? 幸好 答案是可以 Xcode已经加入类似的功能 以直接从整合开发环境 配置颜色渲染模式
这是Xcode Open 显示的是Planets app分镜脚本 图像视图界面已经扩展成 可以指定颜色渲染模式 产生的颜色配置也能与 先前原有的配置结合 如果想知道 更多界面生成器的新功能 请参考今年的 “用风格建构界面” 我们已经介绍完 这些不同的颜色模式 要怎么把它们 与其他配置结合 产生更复杂的效果呢? 幸好并不难 现在再看另一个示例 这次用快捷指令app 各个操作的图标都相当大 但是看起来也有 分层颜色渲染模式 所以我们需要两个配置 一个用来指定字体大小 一个用来指定颜色配置
但是我们只能套用一个指令 要怎么结合在一起? 原来有个简单的方法 有个方法可以结合两个配置 产生同时拥有两种配置 之元素的一个配置
在这个示例中 我们创建两个配置 一个用来规定字体大小 另一个用来规定分层颜色
接着用套用的方法将之结合 产生最终配置 配置会套用到图像视图 显示图像 给我们想要的效果 请注意 此机制 不只限于颜色配置 也能用在 其他类型的配置 例如结合文字、字体和粗细
现在我们知道如何结合不同的配置 还剩下一个主题 在属性字符串使用彩色符号 这是最后一个示例 这是一个想象的app 列出不同的旅馆 以及空房信息 有几个地方 符号结合了文字 但是先把重点放在房间设施 以及我们如何实现此文字 相当简单 但有点复杂 我们必须用图像附件 建造一个属性字符串
首先先加载图像 用正确的颜色配置 在这个例子中 我们会使用分层 颜色配置
我们用这个图像创建文字附件 然后再用这个附件 完成我们的属性字符串 接着在所有空房设施中重复 在显示文字的标签上 我们也能指定正确的字型 以及跟分层颜色配置相同的 文字颜色
单色符号会自动选择文字颜色 但是如果是有颜色配置的符号 我们必须明确指定颜色 彩色符号会选用 字串指定的字体大小 跟单色符号一样
完成这些步骤后 我们会得到想要的结果 内容、颜色和大小都正确的标签 这要感谢属性字符串的符号整合
除了SF Symbol原有颜色模式之外 我们还介绍了三种新颜色模式 我们解释了如何在app中 使用这些模式 符号可以为app添加高质量图像 彩色符号又更加以扩充 拥有更多可能性
如果喜欢这节视频 请别错过 几个相关视频 可观看“SF Symbols的新功能” 可以作为新功能的入门 或看看 “SwiftUI中的SF Symbols 学习如何在SwiftUI 应用新符号 感谢收看 现在开始动手做些厉害的app吧! [轻快的音乐]
-
-
1:52 - Monochrome symbols
// Play let playImage = UIImage(systemName: "play") playImageView.image = playImage playImageView.tintColor = .systemBlue
-
3:00 - Hierarchical symbols
// Device image var image = NSImage(systemSymbolName: "ipad.landscape", accessibilityDescription: "iPad") let config = NSImage.SymbolConfiguration(hierarchicalColor: .label) deviceView.image = image deviceView.symbolConfiguration = config
-
4:13 - Setup button configurations
// Initialize button configuration let speakerConfig = UIButtonConfiguration.plain speakerConfig.image = UIImage(systemName: "speaker.wave.2") let callConfig = UIButtonConfiguration.plain callConfig.image = UIImage(systemName: "phone") let deleteConfig = UIButtonConfiguration.plain deleteConfig.image = UIImage(systemName: "trash")
-
4:40 - Image variants
// Button container view actionsView.imageVariant = .none
-
4:44 - Image variants
// Button container view actionsView.imageVariant = .circle
-
4:51 - Image variants
// Button container view actionsView.imageVariant = .circle.fill
-
5:09 - Speaker button color configuration
// Speaker button color configuration let config = UIImage.SymbolConfiguration(paletteColors: [.tintColor, .systemGray2]) speakerConfig.preferredSymbolConfigurationForImage = config speakerButton.configuration = speakerConfig
-
5:40 - Call button color configuration
// Call button color configuration let config = UIImage.SymbolConfiguration(paletteColors: [.white, .tintColor]) callConfig.preferredSymbolConfigurationForImage = config callButton.configuration = callConfig
-
5:56 - Delete button color configuration
// Delete button color configuration let config = UIImage.SymbolConfiguration(paletteColors: [.white, .systemRed]) deleteConfig.preferredSymbolConfigurationForImage = config deleteButton.configuration = deleteConfig
-
6:10 - Colors matter
// Colors matter! let config = UIImage.SymbolConfiguration(paletteColors: [.tintColor, .systemGray2]) let config = UIImage.SymbolConfiguration(paletteColors: [.white, .tintColor]) let config = UIImage.SymbolConfiguration(paletteColors: [.white, .systemRed])
-
6:46 - Tint color
view.backgroundColor = .tintColor label.textColor = .tintColor searchField.tokenBackgroundColor = .tintColor tabBarItem.badgeColor = .tintColor
-
9:03 - Multicolor symbols
// configure table view cell let image = UIImage(systemName: category.iconName) cell.imageView.image = image
-
9:13 - Multicolor symbols
// configure table view cell let image = UIImage(systemName: category.iconName) let config = UIImage.SymbolConfiguration.preferringMultiColor let tintColor = category.colorForIcon cell.imageView.image = image cell.imageView.preferredSymbolConfiguration = config cell.imageView.tintColor = tintColor
-
9:58 - Multicolor symbols
// configure table view cell let image = UIImage(systemName: category.iconName) let config = UIImage.SymbolConfiguration.preferringMultiColor let tintColor = category.colorForIcon cell.imageView.image = image cell.imageView.preferredSymbolConfiguration = config cell.imageView.tintColor = tintColor
-
12:25 - Combining configurations
// combined configuration let image = UIImage(systemImage: "ipad.and.iphone") headerView.image = image
-
12:40 - Combining configurations
// Combined configuration let image = UIImage(systemImage: "ipad.and.iphone") headerView.image = image let fontConfig = UIImage.SymbolConfiguration(pointSize: 60, scale: .large) let colorConfig = UIImage.SymbolConfiguration(hierarchicalColor: .systemBlue) let config = fontConfig.applying(colorConfig) headerView.preferredSymbolConfiguration = config
-
13:20 - Symbols in attributed strings
// Hotel amenities let amenitiesString = NSMutableAttributedString(...) if (room.amenities.contains(.tv)) { let config = UIImage.SymbolConfiguration( hierarchicalColor: .systemGreen) let tvImage = UIImage(systemImage: "tv", withConfiguration: config) let attachment = NSTextAttachment(image: tvImage) let attachmentString = NSAttributedString(attachment: attachment) let tvString = attachmentString.mutableCopy() tvString.append(NSAttributedString(" TV, ") amenitiesString.append(tvString) }
-
13:51 - Symbols in attributed strings
// hotel amenities let amenitiesLabel = UILabel() amenitiesLabel.textColor = .systemGreen amenitiesLabel.font = UIFont.systemFont(ofSize: 25) amenitiesLabel.attributedString = amenitiesString
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。