自定义SF Symbols:可变模板与三个必需源设计
Apple提供了超过6,900个SF Symbols,SF Symbols应用也免费提供。但大多数应用迟早会需要Apple没有的图标:品牌标识、特定领域的字形,或无法纳入系统符号语汇的自定义操作。正确路径通常不是直接放入静态SVG,而是创建自定义SF Symbol。原因很简单:自定义SF Symbol可以直接继承系统机制。它会随Dynamic Type缩放,参与Symbol Effects动画,支持4种渲染模式,与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,或⌘E)2。该模板是一个SVG,包含系统定义的尺寸参考线,以及一个待替换的占位符号设计。 - 可变模板只需要3个源设计:Ultralight-Small、Regular-Small和Black-Small。SF Symbols应用会自动插值生成其余24种变体(3种尺寸×9种字重)3。
- 路径兼容性是核心要求:所有3个源设计中的每条路径都必须拥有相同数量的锚点、相同的起点和相同的方向。否则,插值会生成畸形字形。
- 自定义符号支持全部4种渲染模式(monochrome、hierarchical、palette、multicolor)以及图层结构(primary、secondary、tertiary)。Symbol Editor的渲染检查器面板用于将子路径分配到不同图层。
- 最终交付方式:将符号文件作为Symbol Image Set添加到Xcode资源目录中。SwiftUI通过带符号名称的
Image(_:)引用它,其余部分由系统处理。
可变模板
SF Symbols 3(WWDC 2021)引入了可变模板3。它是一个单一SVG文件,包含3个源设计,SF Symbols应用会据此生成完整的27种变体网格。3个源设计分别是:
- Ultralight-Small。 最轻字重,最小尺寸。
- Regular-Small。 中等字重,最小尺寸。
- Black-Small。 最重字重,最小尺寸。
应用会用这3个源设计插值生成其余24个单元格(Ultralight-Medium、Regular-Medium、Black-Medium、Ultralight-Large、Regular-Large、Black-Large,以及每个尺寸下的中间字重)。只要源路径结构兼容,插值过程就会自动完成。
在SF Symbols 3引入可变模板之前,自定义符号需要手动绘制全部27种变体。可变模板把工作量降为3个源设计加自动插值。这正是可控设计投入与足以拖垮项目的工作量之间的差别。
兼容数据要求
路径插值要求3个源路径以相同顺序描述同一个形状2:
- 锚点数量相同。 如果Regular字重下的正方形有4个锚点,那么Ultralight和Black下也必须有4个锚点,即便可见曲率不同。
- 起点相同。 路径的第一个锚点必须处在相同的概念位置上,例如始终是左上角。
- 方向相同。 3条路径必须以相同顺序遍历形状,也就是同为顺时针或同为逆时针。
任一条件不满足,都会产生插值瑕疵:折痕、错误重叠、笔画缺失。SF Symbols应用会暴露其中一部分问题(变体预览会显示插值结果),但更细微的问题可能只会在最终导出的资源中显现。
务实的工作流是先设计Regular-Small,再基于同一套路径骨架减小笔画宽度得到Ultralight,并增大笔画宽度得到Black。这样,每次派生都会天然保留锚点数量、起点和方向。分别独立设计各个字重,往往会制造兼容性问题,调试时间甚至比重新构建还长。
工作流
从概念到可用资源,一共5步:
1. 找到结构相近的现有符号
SF Symbols应用的库中有6,900多个符号。先找到一个在结构上接近您概念的符号,例如带内容的圆形、带叠层的方形、带装饰的线条。导出模板时,会以现有符号的几何结构作为起点。
2. 导出模板
使用File > Export Template…或⌘E。模板类型选择“Variable”。导出的结果是一个SVG文件,其中排布了该符号的3个源字重,并包含参考几何信息,展示SF Symbols用于和SF Pro文本对齐的大写字母高度、基线和视觉边距。
3. 替换模板路径
用矢量编辑器打开SVG(Sketch、Figma、Illustrator、Affinity Designer、Inkscape)。模板中的命名图层包含3个源设计。用自定义设计替换它们,同时保留图层名称,以及大写字母高度和基线对齐关系。
此处必须重视路径兼容性要求:每个字重都应从同一套路径骨架设计,通过改变笔画宽度或填充粗细来变化,而不是重新绘制。矢量工具里的“复制并修改”通常是阻力最小的做法。
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种渲染模式,在自定义符号和系统符号上的工作方式一致4:
- Monochrome。 单色(
foregroundStyle)。这是最简单、也最常用的模式。 - Hierarchical。 单色,但按图层使用不同不透明度。渲染检查器面板中定义的图层会获得预设不透明度;开发者只需应用一种色调,即可自动得到视觉层级。
- Palette。 每个图层显式指定颜色。开发者传入多个
foregroundStyle参数,每个图层使用各自的颜色。 - Multicolor。 每个图层使用Apple定义的固定颜色。对于自定义符号,颜色来自设计师在Symbol Editor的Multicolor配置中指定的值。
图层结构正是hierarchical、palette和multicolor能够工作的基础。没有图层分配的自定义符号会把所有路径折叠到primary图层中;它仍然能以monochrome方式渲染,但在其他模式下不会产生视觉层级。任何能够从层次中受益的符号,都值得花几分钟在渲染检查器面板里分配图层。
常见失败模式
自定义符号失败日志中常见3类问题:
违反路径兼容性。 这是最常见的问题。一个符号“在Regular字重下看起来没问题”,但中间字重出现异常,几乎总是路径兼容性出了问题。诊断方法:打开SF Symbols应用的变体网格,查看中等字重变体;如果出现折痕,或笔画不符合预期插值结果,那么3个源路径中至少有一个违反了兼容性要求。
基线或大写字母高度错位。 如果设计符号时没有遵循模板的基线参考线,它和文本放在一起时就会显得别扭。可见症状是:符号与使用.body文本样式的Text内联放置时,看起来过高或过低。修复方式:使用模板的参考几何,将符号的视觉中心放在大写字母高度的中点。
没有图层分配。 一个内部结构丰富的符号(包含多个视觉元素)如果没有图层分配,只有在monochrome模式下才会正确呈现。应用选择hierarchical或palette模式时,会得到扁平输出。修复方式:打开渲染检查器面板,将每个子路径分配到对应图层(主形状用primary,强调元素用secondary,更细的补充细节用tertiary)。
这一模式对iOS 26+应用意味着什么
有3点结论。
-
应用内图标应使用自定义SF Symbols,而不是原始SVG。 自定义符号工作流确实是工程工作,但系统集成能力(Dynamic Type、Symbol Effects、渲染模式、辅助功能)让这项成本对任何长期存在于UI中的图标都物有所值。静态SVG适合一次性的营销素材,不适合作为核心UI。
-
从单一骨架开始设计;改变笔画粗细,而不是改变路径结构。 违反路径兼容性是最关键的失败模式。稳妥的设计流程是从一个字重(Regular-Small)开始,再基于同一套路径几何减小笔画得到Ultralight、增大笔画得到Black。这样,兼容性从构造上就能成立。
-
任何能从渲染模式中受益的符号,都应显式分配图层。 一个只能以monochrome渲染的符号,等于放弃了SF Symbols系统的一半能力。渲染检查器面板只需要几分钟;得到的符号则可以和系统符号一样参与hierarchical、palette和multicolor模式。
完整的Apple生态系统文章集包括:类型化的App Intents;MCP服务器;路由问题;Foundation Models;执行环境与工具链LLM之别;三个界面;单一事实来源模式;两个MCP服务器;Apple开发钩子;Live Activities;watchOS执行环境;SwiftUI内部机制;RealityKit的空间思维模型;SwiftData模式纪律;Liquid Glass模式;多平台发布;平台矩阵;Vision框架;Symbol Effects;Core ML推理;Writing Tools API;Swift Testing;Privacy Manifest;作为平台能力的辅助功能;SF Pro排版;visionOS空间模式;Speech框架;SwiftData迁移;tvOS焦点引擎;@Observable内部机制;SwiftUI Layout协议深度解析;我拒绝写什么。总入口在Apple生态系统系列。如需更宽泛的iOS与AI代理背景,请参阅iOS代理开发指南。
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模式,不要侵犯品牌商标)同样适用于自定义符号和其他自定义美术资源;除此之外,审核流程会将其视为标准图片资源。
参考资料
-
Apple Developer:SF Symbols。应用下载、符号库浏览器,以及自定义符号创建文档入口。 ↩
-
Apple Developer Documentation:Creating custom symbol images for your app。Apple关于模板导出、SVG结构、路径兼容性要求和Xcode资源目录导入的权威指南。 ↩↩
-
Apple Developer:Create custom symbols(WWDC 2021 session 10250)。介绍可变模板格式和三源设计工作流。 ↩↩
-
Apple Developer Documentation:
SymbolRenderingMode。4种渲染模式(.monochrome、.hierarchical、.palette、.multicolor)以及它们与图层结构的交互。 ↩