从兴趣使然开始,到飞往 WWDC19 坐在场下随着演讲者和五湖四海的朋友从零开始学习 SwiftUI,我都只能是一页页幻灯片对面的观众。对我来说,每年 WWDC 的参与感似乎止步于欣赏精美录制的 session、浏览对比新的文档接口,以及拿 No Overview Available 来寻寻开心而已了。
每个 iOS 开发者的心里都有一场属于他们自己的「最佳 WWDC」,这个节点往往以 WWDC19 作为分界。在 2019 年及以前,现场录制的 session 事事有回应:成功地演示 demo 通常能够赚取一次掌声,平淡地讲出「这次简单一点,用 Playground 做一款简单的 2D 休闲游戏1」也能听取一片笑声。
调整为线上形式之后,消失的临场感换来了更为严谨的陈述,同样还有更为出色的视频调度。按照指定规格录制的 session,能够在保留演讲者原声下,任意排布组织内容和形态:笔记要点和演讲的专家屏幕等分、全屏预渲染的 Liquid Glass 效果演示、甚至像 HomeKit 一样在影棚中搭建一套完整的叙事场景,让产品效果融入其中。
我做不到如此规模的策划和设计,但我可以从每张幻灯片中学习。
制作 Keynote 是一门大智若愚的艺术,WWDC session 中的排布更多时候可以被视作看似朴素的选择:使用 SF Symbols 提炼信息、内容留白和字体排印的统一规整、过渡动画和演讲者的配合等。在我看过的 session 中,我很难找出一份所谓「无趣」的主题,信息密度确有疏密,掌握的前提知识有深浅之分,但最终交付给开发者和设计师的,无论从「Meet…」到「What’s New…」,从「Explore…」到「Essential…」,都是质量上乘、几乎零瑕疵的佳作。
将这些 session 当成作品,像拉片一样反复观看,是我满足好奇的一种手段。
我自认为我是一个喜欢设计的人,但并不意味着我有多善用 OKLCH,又或者我对 Grid System 手拿把掐。我会在浏览推文或 Are.na2 的时候,刻意地去保存、手动转载。我不会因为我是一个 iOS 开发者,所以强迫自己筛选只属于某个平台的资源内容。相反,我倒是希望这些不设边界的设计来源,能在深夜填补我为 app 寻找交互设计灵感的空白瞬间。
按照开发者这种工种来说,特别是呆在小团队,我几乎没有想过会和 Keynote 产生交集,甚至往大了说——演讲。印象中这种「负面新闻缠身」的工具,常常出现的场合是精装白领茶余饭后的笑谈。不过,自从加入谜底宇宙,设计的氛围感一下子就上来了:我开始期待每周五下午组团的“研讨会”。说是研讨会,但它并不定期、并不强制参与,也并不限制主题,这种线上聚会并不打算以技术八股、晦涩的设计名词,又或者「如何在小红书上创造爆款」来笼络人心。因此,如果当周的内容需要我来主持,我就会寻求一个工具去将需要分享的内容更好地组织起来,于是,我开始接触 Keynote。
我不太擅长把这些当作准备,但它们确实让后来的事情变得顺理成章。Grow 很荣幸被 Apple Developer 入选为使用 Liquid Glass 的优秀示例 之一,这是对我们工作的一种认可。同时,也很感谢上海 Apple 开发者中心邀请我们参与两场和 SwiftUI、Liquid Glass 相关的设计、技术线上分享活动。
「将 SwiftUI 和 Liquid Glass 带入 Grow」是我需要解答的技术主题。第一反应就是穷举 API 的使用技巧,把代码和效果图铺好铺满然后交差。说实话,仅凭单薄如纸的一个 Glass 是无法撑满整场内容的。现如今快餐式的「一次性 app」反而能帮开发者熟悉这类 API,借助工具,投喂恰当合适的上下文,便可抹煞一切入门教程存在的必要性。
除了这些,我更想把篇幅留给现实的问题:在复杂项目里想跟上最新设计时兼容要怎么做,以及设计团队应该如何和开发一起调整方向。
Grow 项目的复杂,更多来自于它 UI 层面的混合:一部分结构停留在 Storyboard / XIB 的体系中,负责导航系统的拼装;而更为细致、更繁杂的动画,则交给 UIKit。SwiftUI 当然也在其中,它作为现代项目必备工具,已经足以自然地融入到程序交付的流程中,无论是设计师去尝试原型,还是开发者经由代码拆分后的预览响应。
拿最为庞杂的导航系统来说,我们在梳理新旧并存的可能时,有一条完整清晰的思路:既然 app 需要以 UIKit 作为基本,那么 SwiftUI 的 NavigationStack 便无需参与过多,只要设立一套共享的导航环境即可。方向确立后,结构性的矛盾可以先被解开。
兼容 Liquid Glass 在我看来真正考验的是耐心,修改 app 导航的动作牵扯到的是几乎所有页面,所以要考察所有页面的顶部、底部的按钮、文字和转场动画,还得找出调整后元素布局节奏被打乱的页面,让它们在保持功能性之外,适应这场界面变革。
Grow 的工作模式和常见团队不太一样:我们没有固定办公地点,每隔一周同步一次短会,创意想法和版本内容都在会上共享。大部分问题皆通过 IM 和 Figma comment 来沟通。处理好了沟通摩擦成本,才能允许我们将一部分时间放在新内容实验上。
之所以要进行实验,是因为我们认为 Liquid Glass 良好的观感和简单的接入门槛,能自然地使大多数采用原生组件的 app 从设计上平滑过渡。但另一方面,只依赖目前两种变体和着色能力,也很难做出极富 app 特色的风格效果。毕竟,千篇一律的「零基础教学用 SwiftUI 和 Liquid Glass 制作 List」有效但并不出彩。
我们从广受好评的「洞察小太阳收集罐」开始入手,看看能不能仿照 Liquid Glass 提供的思路,做一个拟真的透明玻璃罐。我们借助了社区的力量,反复调整 shader 中的光学质感后,再将 GLSL 翻译成 SwiftUI/UIKit 可用的版本。
当然,在 Keynote 中也明确提到了,这类完全透明的材质是一种「恰到好处的美丽废物」,天生不适合再去承载额外信息,除了实验性质以外,Grow 不会在其他需要传达内容的场景来使用它。
Grow 一直以来都是设计功能主导的项目,我们手作每月的挑战徽章、体验 Rive 复杂但高效的动画创意工具,积累了众多的设计素材。它们之中,有主流,有遗珠,其实选用几则,就可以确立 Keynote 的主题风格。很感谢团队中的设计朋友们,对这些细节始终保持专注和认真。
我将以上的所有经历,编写成脚本,自然而然地平铺整理到了一张张幻灯片上。整幅 Keynote 观感下来,对我来说它并不仅仅是一篇命题作文,更是我们团队想表达出的一份真诚。如果你当时在直播间,或者现在读到了这里,也希望可以感受到我们、以及谜底宇宙3的这份真诚。
最后,感谢以下这些趁手又好用的工具,它们帮助了我完成了 Keynote 中我想要实现的所有效果:
- Apple Keynote
- Final Cut Pro
- Stupid Raisins 制作的 Final Cut Pro 插件
- Charlie Chapman 制作的 Framous
• • •
1. "But today to keep it simple, I think I'll write a simple casual 2D game." YouTube
2. 我最常用的其实是 posts.cv,不过他们已于 2025.01.18 被 Perplexity 收购,关停了服务。
3. 谜底宇宙的产品包括:谜底小组件、OffScreen、谜底时钟、谜底黑胶、Dtd Playlist、Dtd Sounds、CapWords、Placify、Grow 等。