← 所有文章

自定义SF Symbols:可变模板与三个必需源设计

Apple提供了超过6,000个SF Symbols,且SF Symbols应用免费可用,但大多数应用最终都会需要一个Apple没有的图标:品牌标识、特定领域的字形、不符合系统词汇的自定义操作。正确的做法是创建自定义SF Symbol,而非简单地放入静态SVG,因为自定义SF Symbols能够免费继承系统的整套机制:它们随Dynamic Type缩放、参与Symbol Effects动画、可在四种渲染模式下呈现、与SF Pro字体对齐,并且无需每个应用单独编写代码即可遵循辅助功能设置。静态SVG则完全无法享受这些能力。

本文将以SF Symbols应用的可变模板为线索梳理工作流程。该模板在WWDC 2021随SF Symbols 3引入1。叙述框架是”三个必需的源设计是什么以及为什么”,因为模板格式才是工作流程中承重的关键部分,而大多数设计师和工程师第一次接触时都会忽略它。后续的SF Symbols版本(4、5、6、7)扩展了模板格式,引入了可变颜色、magic replace过渡、渐变支持和动画效果,但可变模板的三源结构核心自SF Symbols 3以来始终保持稳定。

TL;DR

  • 自定义SF Symbols从SF Symbols应用导出的模板开始(File > Export Template,或⌘E2。模板是一个SVG文件,包含用于尺寸定位的系统级参考线和一个待替换的占位符号设计。
  • 可变模板仅需三个源设计:Ultralight-Small、Regular-Small和Black-Small。SF Symbols应用会自动插值生成其余24种变体(3个尺度×9种字重)3
  • 路径兼容性是承重的核心要求:每条路径在所有三个源设计中必须拥有相同数量的锚点、相同的起始点和相同的方向。否则,插值会产生畸形字形。
  • 自定义符号支持全部四种渲染模式(monochrome、hierarchical、palette、multicolor)以及图层结构(primary、secondary、tertiary)。Symbol Editor的渲染检查器面板用于将子路径分配到各图层。
  • 最终交付:将符号文件作为Symbol Image Set添加到Xcode的资源目录中。SwiftUI通过Image(_:)配合符号名称引用它;其余工作由系统处理。

可变模板

SF Symbols 3(WWDC 2021)引入了可变模板3,这是一个单独的SVG文件,捕获三个源设计,SF Symbols应用据此生成完整的27种变体网格。三个源设计为:

  • Ultralight-Small. 最细字重,最小尺度。
  • Regular-Small. 中间字重,最小尺度。
  • Black-Small. 最粗字重,最小尺度。

应用使用这三个源设计来插值生成另外24个单元格(Ultralight-Medium、Regular-Medium、Black-Medium、Ultralight-Large、Regular-Large、Black-Large,以及每个尺度上的中间字重)。只要源路径具备兼容的结构,插值就会自动完成。

在SF Symbols 3引入可变模板之前,自定义符号需要手工绘制全部27种变体。可变模板将其简化为3个源设计加插值——这是”可控的设计工作量”与”会拖垮项目的工作量”之间的差距。

数据兼容性要求

路径插值要求三个源路径以相同的顺序描述相同的形状2

  • 相同数量的锚点。 一个在Regular字重下有4个锚点的方形,在Ultralight和Black下也必须有4个锚点,即便可见的曲率有所不同。
  • 相同的起始点。 路径的第一个锚点在所有三个字重中必须位于相同的概念位置(例如,始终是左上角)。
  • 相同的方向。 三条路径以相同的顺序遍历形状(顺时针或逆时针)。

任何一项不满足都会产生插值异常:折角、错误的重叠、缺失的笔画。SF Symbols应用会显示其中部分问题(变体预览会展示插值结果),但细微的瑕疵只在最终导出的资源中才会暴露。

务实的工作流程是先设计Regular-Small,然后通过减小描边宽度得到Ultralight,通过加粗描边得到Black,全部基于同一套路径骨架。这样每次派生都会从构造上保持锚点数量、起始点和方向一致。独立设计每个字重往往会导致兼容性问题,调试这些问题比重做构造耗时得多。

工作流程

从概念到可用资源的五个步骤:

1. 找到一个相似的现有符号

SF Symbols应用的库中有6,000多个符号。找一个在结构上与你的概念相似的(带内容的圆形、带叠加的方形、带装饰的线条)。导出模板的路径以现有符号的几何结构作为起点。

2. 导出模板

File > Export Template…⌘E。模板类型选择”Variable”。结果是一个SVG文件,其中布置了符号的三个源字重,并附带显示cap高度、基线和视觉边距的参考几何,SF Symbols用这些信息与SF Pro文本对齐。

3. 替换模板路径

在矢量编辑器(Sketch、Figma、Illustrator、Affinity Designer、Inkscape)中打开该SVG。模板的命名图层包含三个源设计。在保留图层名称以及cap-height/基线对齐的前提下,将每个图层替换为你的自定义设计。

路径兼容性要求在此处至关重要:基于同一套路径骨架设计每个字重,调整描边宽度或填充粗细,而非重新绘制。矢量工具的”复制并修改”工作流是阻力最小的路径。

4. 重新导入并验证

将修改后的SVG拖回SF Symbols应用。应用会生成27种变体并在变体网格中展示。在多种缩放级别下检查每一种字重与尺度的组合;插值异常常常出现在中间字重,并不那么显眼。

对于具有多个视觉元素的符号(主体加徽章、圆形加内部形状),打开渲染检查器面板,将子路径分配到各图层(primary、secondary、tertiary)。图层分配决定了符号在hierarchical、palette和multicolor模式下的渲染方式。

5. 添加到Xcode

将从SF Symbols导出的符号文件(.svg)拖入Xcode的资源目录。Xcode会将其视为Symbol Image Set。在代码中引用:

Image("MyCustomSymbol")
    .symbolRenderingMode(.hierarchical)
    .foregroundStyle(.tint)

Image(_:)(不带systemName:参数)从资源目录加载。系统符号上可用的.symbolRenderingMode.foregroundStyle.symbolEffect和Dynamic Type行为,在自定义符号上同样可用,前提是符号被正确创作。

渲染模式与图层结构

SF Symbols暴露的四种渲染模式在自定义符号上的工作方式与系统符号完全相同4

  • Monochrome. 单色(foregroundStyle)。最简单的模式,也最常用。
  • Hierarchical. 单色,按图层变化不透明度。在渲染检查器面板中定义的图层会获得预设的不透明度;开发者只需应用一种着色,就能自动获得视觉层级。
  • Palette. 每个图层显式指定颜色。开发者传入多个foregroundStyle参数;每个图层各取其一。
  • Multicolor. Apple为每个图层定义的固定颜色。对自定义符号而言,颜色是设计师在Symbol Editor的Multicolor配置中分配的那些。

图层结构正是hierarchical、palette和multicolor得以工作的基础。一个未做图层分配的自定义符号会将所有路径折叠进primary图层;该符号在monochrome下仍可渲染,但在其他模式下不会产生任何视觉层级。值得花时间在渲染检查器面板中为任何能从深度感受益的符号分配图层。

常见失败

来自自定义符号失败日志的三种模式:

路径兼容性违规。 最常见的问题。一个”在Regular字重下看起来正常”但在中间字重产生瑕疵的符号,几乎都存在路径兼容性问题。诊断方法:打开SF Symbols应用的变体网格,查看中等字重的变体;如果它们出现折角或与预期插值不符的笔画,那么三个源路径之一违反了兼容性。

基线或cap高度未对齐。 未遵循模板基线参考线的符号在文本旁边会显得别扭。视觉症状:当符号与.body字号的Text内联放置时,看起来过高或过低。修复方法:使用模板的参考几何;将符号的视觉中心定位在cap高度的中点上。

未做图层分配。 一个具有丰富内部结构(多个视觉元素)但未做图层分配的符号,仅在monochrome下能正确渲染。选择hierarchical或palette模式的应用会看到扁平的输出。修复方法:打开渲染检查器面板,将每条子路径分配到一个图层(主形状用primary、点缀用secondary、第三层细节用tertiary)。

这一模式对iOS 26+应用意味着什么

三个要点。

  1. 应用内图标使用自定义SF Symbols,而非原始SVG。 自定义符号的工作流程是实打实的工程工作,但系统集成(Dynamic Type、Symbol Effects、渲染模式、辅助功能)让任何长期存在于UI中的图标都值得这份成本。静态SVG适合一次性的营销资源,不适合核心UI。

  2. 从单一骨架设计;变化的是描边粗细,而非路径结构。 路径兼容性违规是承重的失败模式。防御性的设计流程是先从一种字重(Regular-Small)开始,基于同一套路径几何减小描边得到Ultralight,加粗描边得到Black。兼容性由构造保证。

  3. 为任何能从渲染模式受益的符号显式分配图层。 一个仅在monochrome下渲染的符号,等于主动放弃了SF Symbols系统的一半能力。打开渲染检查器面板只需几分钟;换来的是与系统符号一同参与hierarchical、palette和multicolor模式的符号。

完整的Apple生态集群:类型化的App IntentsMCP服务器路由问题Foundation Models运行时与工具LLM的区别三个表面单一可信源模式两个MCP服务器Apple开发的钩子Live ActivitieswatchOS运行时SwiftUI内部机制RealityKit的空间心智模型SwiftData架构纪律Liquid Glass模式多平台发布平台矩阵Vision框架Symbol EffectsCore ML推理Writing Tools APISwift TestingPrivacy Manifest作为平台的辅助功能SF Pro字体系统visionOS空间模式Speech框架SwiftData迁移tvOS焦点引擎@Observable内部机制SwiftUI Layout协议我拒绝写的内容。集合中心位于Apple生态系列。如需更广义的iOS与AI智能体语境,请参阅iOS Agent开发指南

FAQ

我必须使用SF Symbols应用,还是可以用其他方式创建自定义符号?

SF Symbols应用是官方工具,也是唯一能产出经过验证、与App Store兼容的自定义符号的工具。第三方工具和在线转换器存在,但它们生成的SVG未必满足模板格式的要求。生产应用请使用SF Symbols应用。

我可以在Windows上创建自定义符号吗?

SF Symbols应用仅支持macOS。您可以在任何带矢量编辑器的平台上编辑导出的SVG模板,但导出和重新导入步骤需要macOS。多数团队至少有一位设计师使用macOS来处理这些步骤;远程团队的工作流通过版本控制或共享存储来传递SVG文件。

如何在自定义符号上支持.symbolEffect

只要符号结构良好,大多数符号效果都会自动生效:bounce、pulse、scale等效果不论符号来源都能应用。.replace内容过渡需要起始符号和目标符号具备兼容的结构(相近的图层数量、相近的整体形状)。本集群的Symbol Effects文章详细介绍了效果词汇。

Xcode中Symbol Image Set与普通Image Set有何区别?

Symbol Image Set导入符号的完整模板(全部27种变体),并通过SF Symbols的渲染管线暴露它们。该符号随Dynamic Type缩放、参与渲染模式,并能配合.symbolEffect使用。普通Image Set是静态的栅格或SVG资源,不参与上述任何能力。自定义SF Symbols请使用Symbol Image Set。

自定义符号在visionOS和watchOS上如何处理?

与系统符号的处理方式相同:它们以平台预期的尺寸渲染(watchOS上为小号,visionOS上为大号),参与平台的辅助功能特性,并遵循平台的颜色与效果约定。自定义符号的创作是一次性的;跨平台行为是自动的。本集群的Apple平台矩阵visionOS空间模式文章涵盖了各平台的具体注意事项。

App Store审核会受什么影响?

没有影响。自定义SF Symbols的审核方式与其他Asset Catalog资源完全相同。视觉风格指南(不要冒充Apple的UI模式、不要侵犯品牌商标)适用于自定义符号,正如适用于其他自定义美术资源;除此之外,审核流程将其视为标准的图像资源。

参考资料


  1. Apple Developer:SF Symbols。应用下载、符号库浏览器以及自定义符号创建的文档中心。 

  2. Apple开发者文档:Creating custom symbol images for your app。Apple的权威指南,涵盖模板导出、SVG结构、路径兼容性要求以及Xcode资源目录导入。 

  3. Apple Developer:Create custom symbols(WWDC 2021第10250场会议)。可变模板格式与三源设计工作流程的发布介绍。 

  4. Apple开发者文档:SymbolRenderingMode。四种渲染模式(.monochrome.hierarchical.palette.multicolor)及其与图层结构的交互。 

相关文章

Symbol Effects: SwiftUI's Built-In Animation Vocabulary For Every Icon

SF Symbols ships an animation vocabulary every iOS app can speak. Bounce, pulse, scale, replace, variable color, breathe…

12 分钟阅读

Liquid Glass in SwiftUI: Three Patterns From Shipping Return on iOS 26

Apple's Liquid Glass is a one-line SwiftUI API. Three patterns from Return go beyond .glassEffect(): glass on text via C…

19 分钟阅读

Taste Is Infrastructure: Encoding Aesthetic Judgment for AI

Agents have capability without opinion. The quality ceiling depends on how well you encode aesthetic judgment into hooks…

8 分钟阅读