本文核心组件之一,用于封装内容显隐并完成高度测量与动画。内部通过 displayValue 状态机解耦数据与渲染生命周期,配合 VisibleHeightLayout 向父容器报告可见高度、向子视图保持 intrinsic 尺寸,避免内容被压缩。最终实现 List row 高度的连续插值过渡。
用自定义 Layout 化解 SwiftUI List 的行高与间距跳变
AnimatedPresence
本文核心组件之一,用于封装内容显隐并完成高度测量与动画。内部通过 displayValue 状态机解耦数据与渲染生命周期,配合 VisibleHeightLayout 向父容器报告可见高度、向子视图保持 intrinsic 尺寸,避免内容被压缩。最终实现 List row 高度的连续插值过渡。
AnimatedPresence
文中利用 ViewModifier 遵循 Animatable 的特性,让原本静态的 LayoutValueKey 获得逐帧插值能力。通过在 body 中重写 layoutValue,CollapsibleSpacingVStack 能够读取 AnimatedPresence 暴露的折叠进度,从而把 spacing 变化同步到同一动画时间线。
ViewModifier
本文将 SwiftUI 定位为声明式动画的核心框架,但其 List 容器在行高动态变化时无法自动提供高度插值,导致跳变问题。作者通过纯原生能力(Animatable、自定义 Layout 等)解决这一限制,避免了回退到 UIKit 或放弃动画。文章强调 SwiftUI 的布局信息单向流动特性是问题根源,同时指出其能力边界比初次遇到的限制更宽。
SwiftUI
本文指出 List 因绑定宿主平台滚动机制,为保证复用与性能,会在内容高度变化时直接硬性重排,无法对 row 高度进行连续动画插值。典型场景包括副标题显隐或文本行数变化,导致高度跳变而非平滑过渡。解决方案围绕 List 内部构建自定义布局容器,实现高度与间距的显式动画控制。
List
本文将 Animatable 协议作为 SwiftUI 提供的动画插值工具之一,与 LayoutValueKey 结合使用。通过让 ViewModifier 遵循该协议,可在事务内逐帧重写 layoutValue,使原本静态的布局属性获得动画能力。作者用此机制让 CollapsibleSpacingVStack 中的间距随折叠进度同步变化,避免二段跳变。
Animatable
文章指出,把带 if 显隐与 animation 的代码放在 VStack 或 LazyVStack 中,行高变化通常能平滑过渡。但相同代码放入 List 后,高度却出现硬切换与闪烁。LazyVStack 因此被用来衬托 List 在复用与尺寸计算上的特殊约束,以及自定义 Layout 方案的必要性。
LazyVStack
本文将 geometryGroup 列为 SwiftUI 提供的两个高度动画工具之一(另一个是 Animatable),用于将动画插值过程显式化或上提。但实际解决方案主要依赖自定义 Layout 协议,未深入使用 geometryGroup 作为核心手段。
geometryGroup
本文在 CollapsibleSpacingVStack 中使用 LayoutValueKey 让子视图显式声明折叠状态与进度(0...1)。通过 Animatable ViewModifier 间接实现该值的动画插值,父布局据此按比例缩减相邻间距,并在折叠完成后为新相邻 sibling 补回 bridge spacing。解决了 spacing 突变导致的视觉不连贯问题。
LayoutValueKey
为解决折叠时 spacing 突变而设计的 VStack 复刻版。它识别带有 ignoredWhenCollapsed 标记的子视图,按 collapsibleSpacingProgress 动态缩放相邻间距,并在折叠区段前后补 bridge spacing。配合 AnimatedPresence,使高度与间距变化锁定在同一动画曲线上,消除 List 中的二段跳。
CollapsibleSpacingVStack
VisibleHeightLayout 是本文提出的自定义 Layout 容器,专门用于解决 List 行高动画跳变。它在 sizeThatFits 中向父容器返回 (intrinsic.width, visibleHeight),而在 placeSubviews 时始终用子视图的 intrinsic 尺寸进行放置,从而实现父级高度连续插值而子内容不被压缩。配合 .clipped(),该布局既保证动画平滑,又为 AnimatedPresence 提供了稳定的目标高度测量锚点,是整套原生方案的核心组件。
VisibleHeightLayout
文中对比了普通 VStack 与 List 的差异:VStack 或 LazyVStack 中内容显隐通常可正常动画,但放入 List 后行高变为硬切。标准 VStack 对子视图的 spacing 承诺是无条件的,即使子视图高度折叠至 0 仍会保留间距,导致动画末段出现二段跳。文章为此设计了 CollapsibleSpacingVStack 作为替代。
VStack
本文将 UIKit 作为命令式框架的代表,指出其可通过预计算尺寸与 performBatchUpdates 实现先算后交的动画控制。SwiftUI 的响应式数据流则缺少这一缓冲区,导致 List 无法自动为动态行高提供插值。文章最终给出的方案完全不依赖 UIKit,而是通过原生 Layout 协议与状态解耦达成类似效果。
UIKit
本文核心方案是实现 VisibleHeightLayout 与 CollapsibleSpacingVStack 两个自定义 Layout,用于分离父容器申报尺寸与子视图实际摆放尺寸。sizeThatFits 返回动画中的可见高度,placeSubviews 则始终使用子视图 intrinsic 尺寸,避免内容被压缩。配合 clipped() 实现裁剪而非挤压的折叠效果,同时为目标高度测量提供稳定锚点。
Layout
Swift 是本文作者实现纯原生聊天应用的主要编程语言,常与 SwiftUI 搭配使用。作者先用 Swift 构建 Markdown 渲染界面,随后因选择功能缺失而转向 NSTextView 和 TextKit 2,但流式文本更新仍导致性能问题。文章指出 Swift 虽适合性能关键模块,却无法单独解决富文本聊天所需的完整交互与渲染需求。
Swift
作者在多次原生尝试失败后改用 WebKit 渲染 Markdown,实际效果良好。性能表现稳定,排版接近完美,同时具备合理的控制能力。尽管存在少量注意事项,但整体上能满足聊天界面中富文本选择与展示的需求,与此前 TextKit 等方案的反复挣扎形成鲜明对比。
WebKit
本文中作者尝试在 NSTextView 里引入 TextKit 2 来支持 Markdown 聊天界面的文本选择与渲染,却发现它与 SwiftUI 配合困难,导致前期性能优化工作失效。流式输入模型响应时出现明显 CPU 峰值,纯 TextKit 2 原型虽基础性能尚可,但流式文本更新依然糟糕,需要手动处理文本块扩展,且与现代框架兼容性差。文章以此说明 TextKit 2 在构建可选择富文本聊天 UI 时仍存在明显短板。
TextKit 2
SwiftUI 被作者用来快速搭建支持 Markdown 的聊天界面和滚动列表。实际使用中它无法实现对整个 Markdown 文档的文本选择,这是框架设计上的限制。作者因此放弃部分 SwiftUI 实现,转而混合使用 AppKit 组件,却发现界面性能和兼容性进一步恶化,最终认为其更适合简单无滚动场景。
SwiftUI
作者在 SwiftUI 和 NSTextView 方案受阻后转向 AppKit,借助其成熟的 NSCollectionView 实现聊天消息列表,以求获得稳定性能。但实际使用中发现单元格无论怎样优化都会出现闪烁,这一设计缺陷无法消除。作者原本期望 AppKit 能提供可靠基础,却在结合流式富文本需求时仍面临挑战,最终未能达到预期效果。
AppKit
文章提到 SwiftUI 与 Raycast v1 同期成熟,但因性能与控制力不足而未被大量采用,仅在年度 Wrapped 功能中作为孤立模块存在。v2 重构后宿主层改用 AppKit,SwiftUI 并未成为跨平台或核心 UI 的选择,体现了团队对原生框架性能门槛的严格要求。
SwiftUI
macOS宿主应用通过WKWebView加载React前端,文章详细描述了为解决WebKit节流、窗口resize卡顿、展开动画空白等问题所做的多项绕过工作,如保持WebView帧尺寸固定、禁用遮挡检测、使用_doAfterNextPresentationUpdate同步渲染等。这些优化确保了启动与切换时的流畅体验。
WKWebView
本文将 TextKit 与 WebKit 进行对比,指出 macOS 原生的 TextKit 虽然功能完备,但在处理 AI Chat 中的富文本渲染、Markdown、代码高亮等场景时,WebKit 的优化投入更多、表现更优。Raycast 2.0 因此选择 Web 技术栈来提升这类内容的滚动与显示性能,同时仍保持对原生体验的控制。
TextKit
在处理窗口大小调整动画时,Raycast 通过重写 NSWindow.setFrame 方法,使用隐式的 Core Animation 替代 WebKit 默认的动画调用。这一调整解决了 WebKit 在窗口 resize 期间暂停绘制导致的卡顿问题,确保 WebView 在动画过程中持续渲染,从而让界面过渡更流畅自然。
Core Animation
Raycast 2.0 在 macOS 使用 WKWebView 承载 React 前端。为解决启动闪烁、窗口缩放卡顿、渲染节流等问题,团队通过调整窗口层级、禁用遮挡检测、预热字体及同步呈现更新等手段,让 WebKit 适应频繁显示隐藏的启动器场景,同时保留了系统原生视觉效果。
WebKit
v1 版本 Raycast 以 Swift + AppKit 构建原生 macOS 应用,自行实现列表、快捷键等全部 UI 组件以满足键盘优先需求。v2 中 macOS 宿主应用仍使用 AppKit 管理窗口、全局热键、菜单栏和 WKWebView 加载,同时保留对平台原生特性的完全控制,避免了标准组件在性能与定制上的限制。
AppKit
Swift 在文章中专指 macOS 宿主应用的实现语言,负责原生窗口、菜单栏、全局热键及 WKWebView 的生命周期管理。v2 版本中 Swift 代码量大幅减少,主要聚焦于平台特性暴露与性能调优,例如禁用 WebKit 遮挡检测、自定义 NSWindow setFrame 以消除动画卡顿。文章对比了 v1 中 AppKit 主导的实现,指出 Swift 现仅作为轻量外壳存在。
Swift
本文的 ScrollingSurface 组件在水平滚动方向中,使用 LazyHStack 配合 ScrollView 实现内容的横向懒加载布局,同时应用 scrollTargetLayout 修饰符优化滚动性能。
LazyHStack
本文作者 Majid Jabrayilov 以自身 CardioBot 应用的重构为例,演示如何使用 ScrollView、Lazy 栈和 Container View API 构建可复用的自定义滚动容器。
Majid Jabrayilov
本文在 ScrollingSurface 组件的垂直方向实现中使用了 LazyVStack。它与 ScrollView 配合实现内容懒加载,替代 List 的单元格复用机制。作者强调此组合在性能与自定义样式之间取得了更好平衡,适用于 CardioBot 的多类型卡片界面。
LazyVStack
DividedCard 利用 Group(subviews:) API 分解传入的子视图,为每个子视图后添加 Divider 分隔线,最终用圆角背景包裹形成卡片样式。
Group(subviews:)
本文推荐 ScrollView 搭配惰性堆栈作为 List 的替代,用于非均匀数据展示。作者创建 ScrollingSurface 组件将其封装,支持垂直或水平方向,并添加 scrollTargetLayout 与 padding。文章强调其性能已足够支持日常应用场景。
ScrollView
SummaryView 示例中,NavigationLink 结合自定义 NavigationButtonStyle 使用,在 DividedCard 内实现点击导航到详情页,并自动添加右侧 chevron 指示器。
NavigationLink
文章指出 List 适合展示均匀数据,但在 CardioBot 这类混合卡片界面中并非最佳选择。作者目前使用 List 配合 listRowBackground 等修饰符,但这些修饰符无法在 List 外工作,导致样式受限。最终决定用 ScrollView 加惰性堆栈构建更灵活的替代方案。
List
本文中 SwiftUI 被用作构建自定义可滚动容器的框架。作者指出近年来其 ScrollView 与惰性堆栈的性能大幅提升,适合非均匀数据场景。文章通过 ScrollingSurface 等组件展示如何利用 SwiftUI 实现对界面外观的精确控制,替代标准 List。
SwiftUI
SectionedSurface 通过 ForEach(sections:) 提取内容中的 sections,过滤空内容部分,并为 header 添加顶部 padding,实现类似 List 的分区布局。
ForEach(sections:)
SwiftUI 的 Container View APIs 用于分解视图、应用修改后重新组合。本文通过 Group(subviews:) 实现 DividedCard 的分隔线逻辑,通过 ForEach(sections:) 构建 SectionedSurface。作者用这些 API 创建可复用的自定义容器,实现对 List 样式的精确复刻与扩展。
Container View APIs
作者针对 Safari 不支持 SVG favicon 媒体查询的问题提交了 WebKit bug(编号 309949),希望未来能让该功能正常工作。
WebKit
本文中 SwiftUI 是引入 lineHeight 修饰符的 UI 框架,iOS 26 新增该功能用于控制文本基线距离。它支持预设值和数值方法,比旧有 lineSpacing 更灵活,文章通过示例展示其在段落排版中的实际效果,并建议在现代布局中优先使用。
SwiftUI
Dynamic Type 在本文指系统字体大小变化机制,不同 lineHeight 配置对其响应不同。multiple 和 leading 方法会随字体放大保持比例,而 exact(points:) 固定值可能导致文本截断或重叠,文章通过对比图说明开发者需根据场景选择合适方式以保证可读性。
Dynamic Type
本文作者在结尾推荐自己的另一本书 SwiftUI Fundamentals,称其深入讲解框架核心原理与 API,帮助读者理解底层机制并高效使用。该书与 The SwiftUI Way 共同构成作者的 SwiftUI 资源系列。
SwiftUI Fundamentals
iOS 26 是本文讨论的平台版本,首次提供 lineHeight(_:) 修饰符与 AttributedString.LineHeight 属性。这些新 API 让开发者能精确调整 SwiftUI 文本行距,并与 Dynamic Type 配合,文章对比了不同配置在字体放大时的表现。
iOS
本文将 lineSpacing(:) 描述为较早推出的 SwiftUI 修饰符,用于设置一行文本底部到下一行顶部的间距。它与 iOS 26 新增的 lineHeight(:) 不同,后者定义的是两行基线之间的距离。作者认为 lineHeight(_:) 配置选项更多,在现代布局中更灵活,但具体选择仍取决于项目需求。
lineSpacing(_:)
本文中 AttributedString 支持附加 LineHeight 属性以控制文本行距,可通过新修饰符或直接设置实现排版调整。相比传统方式,它提供了更多配置选项,文章展示如何结合倍数或固定值来适应不同布局需求,同时提醒 exact 模式在字体放大时可能出现问题。
AttributedString
本文说明 Font.Leading 是 leading(_:) 修饰符的参数类型,仅包含 standard、loose、tight 三个枚举值。它自 iOS 14 起可用,用于对字体应用行高调整。作者提到使用该枚举的效果较为有限,适合需要微妙变化的布局。
Font.Leading
本文作者 Natalia Panferova 是软件工程师,文章署名并附有其 Twitter 链接与头像。她在文中分享 iOS 26 文本布局新 API 的实践对比,并推广自己的两本 SwiftUI 书籍。
Natalia Panferova
本文介绍 leading(_:) 是自 iOS 14 起提供的 Font 修饰符,可直接作用于 Font 实例来调整行间距。示例用法为 .font(.title.leading(.loose)),它接受 Font.Leading 参数。作者指出该修饰符带来的变化较为微妙,在多数场景下灵活性有限。
leading(_:)
本文中 AttributedString.LineHeight 是定义行高的属性类型,提供 loose、tight、normal、variable 等静态属性,以及 multiple(factor:)、leading(increase:)、exact(points:) 等方法。它既可直接用于 AttributedString 样式,也能通过 lineHeight 修饰符应用,文章重点比较了各方法随 Dynamic Type 缩放的行为差异。
AttributedString.LineHeight
lineHeight(_:) 是 iOS 26 在 SwiftUI 中新增的视图修饰符,接受 AttributedString.LineHeight 参数来设置行间基线距离。文章演示了 loose、tight 等预设及 multiple、exact 等方法的效果,并指出它比 lineSpacing 更适合精细排版,尤其在动态字体场景下需注意 fixed 值可能导致溢出。
AttributedString.LineHeight
本文多次提及作者新书 The SwiftUI Way,副标题为 A field guide to SwiftUI patterns and anti-patterns,旨在帮助开发者采用推荐模式、避免常见陷阱。文章底部提供购买链接,并将其与另一本书搭配推荐。
The SwiftUI Way
本文深入剖析了 SwiftUI 动画系统的底层工作原理,指出状态变化是触发视图更新的唯一途径。SwiftUI 会对比新旧视图树、识别可动画属性,再按时间曲线以约 60fps 进行插值,从而实现平滑过渡。动画具有可叠加和可取消特性,中断后新动画会从当前渲染状态自然延续,无需开发者手动处理位置计算。
SwiftUI
本文将 withAnimation 归类为显式动画方式,用于在按钮或手势等事件中包裹状态变更以触发动画。iOS 17 后支持 completion 闭包,文章对比了它与隐式 .animation 修饰符的优先级及适用场景。
withAnimation
iOS 17 新增了作用域动画语法,可将动画限定在特定修饰符链内,避免影响其他属性。同时提供了动画完成回调,支持在 withAnimation 或 transaction 中执行后续逻辑。这些 API 让事务传播和依赖追踪更精确,解决了旧版中动画结束时机难以捕获的问题。
iOS 17
本文指出 Transaction 是 SwiftUI 动画的底层机制,withAnimation 只是其语法糖,用于向下传递动画信息。文章说明可通过 .transaction 修改器拦截并禁用动画或添加完成回调(iOS 17+),同时提醒无 value 参数时依赖追踪可能失效。
Transaction
显式动画使用 withAnimation 包裹状态变更代码,适用于按钮或手势等事件驱动场景。动画上下文会自动向下传播到受影响的视图,无需在每个视图上添加修饰符。但当视图树中同时存在隐式动画时,后者会优先执行并取代前者。
Explicit Animation
AnimatablePair 用于同时动画多个自定义属性,支持两层嵌套以处理三个或以上数值。文章演示了将 scale 与 rotation 组合的 ComplexModifier,以及三属性时的嵌套写法,使复杂同步动画成为可能。使用时需正确映射 first 与 second,避免因类型不匹配导致动画失效。
AnimatablePair
本文发布于 SwiftDifferently 站点,标题为“How Your Views Actually Move”,聚焦 SwiftUI 动画底层原理。文章由 Omar Elsayed 撰写,系统梳理了状态驱动、Animatable 协议及过渡机制,帮助开发者理解流畅动画的实现原理。
SwiftDifferently
本文作者 Omar Elsayed 在更新 SwiftUI 动画参考资料时深入研究了动画系统,分享了从隐式/显式动画到 Transaction 的实践心得。文章以其个人探索经历为引,解释了常见动画失效原因及性能优化建议。
Omar Elsayed
隐式动画通过 .animation(_:value:) 修饰符与特定状态值绑定,仅在该值变化时触发动画。文章强调修饰符在链中的位置决定其作用范围,且隐式动画会覆盖显式动画。无 value 参数的旧用法已被弃用,因其会在任何状态变化时触发不可控动画。
Implicit Animation
本文将 Transition 定义为视图在层级中插入或移除时触发的动画机制,与属性动画不同,它处理的是不同视图的出现与消失。文章强调动画修饰符必须放在条件语句外,否则移除时无法执行动画,并介绍了 .scale、.opacity、.slide 等内置过渡及组合用法。
Transition
Animatable 协议通过实现 animatableData 属性,让 SwiftUI 知道需要对哪些自定义数值进行插值,从而支持 shake 等非标准动画效果。文章给出 ShakeModifier 示例,展示如何将 Double 值映射为正弦偏移。未显式实现该属性时,系统默认使用 EmptyAnimatableData,导致动画直接跳到终值而无过渡。
Animatable
Thomas Ricouard 是本文作者与叙述者,一位专注 iOS/Mac 的开发者。他以自身 2025 年实践为例,全面回顾 AI 工具如何改变日常编码、调试与架构工作。文中分享其持续跟踪 AI 趋势的动力,并引用 Karpathy 观点佐证跟进必要性。
Thomas Ricouard
本文中 iOS 是作者聚焦的开发平台,主题围绕 2026 年 Agentic AI 如何重塑 iOS 工程实践。作者在 2025 年针对 iOS 项目反复实验新工作流,体会到「工作量大但实际编码少」的效率变化。文章强调 AI 工具已深度嵌入 iOS 开发流程,Xcode 的传统角色也随之改变。
iOS
文章专设章节讨论 Xcode 作为文本编辑器已被废弃。在 AI 驱动的 iOS 开发中,Xcode 不再是主要代码编写环境,作者转向集成 Agentic AI 的新型工具链。文中指出这一转变让开发者工作方式发生根本变化,效率显著提升。
Xcode
作者为实现 Bun 的 JavaScript 运行时,花费大量时间阅读 WebKit 源码,研究如何像 Safari 一样灵活嵌入 JavaScriptCore,最终完成早期运行时原型。
WebKit
本文中Xcode被用来新建iOS应用,直接读取/private/var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache路径下的MobileGestalt.plist文件。作者通过SwiftUI界面实现加载与导出功能,绕过部分快捷指令限制。文章强调此方法在iOS 26.1上仍可读取该文件。
Xcode
本文中SwiftUI用于构建示例应用界面,实现MobileGestalt.plist的读取、暂存与导出。代码中通过@State与DocumentPickerCoordinator处理plist数据与文件选择器交互。文章提供了完整ContentView代码,展示如何在不越狱情况下获取该文件。
SwiftUI
Linear 使用 SwiftUI 构建自定义玻璃材质,从单一 view modifier 同时应用多层效果。包括通过 SwiftUI shader 计算高光,并用 SDF 生成法线贴图实现实时光照。借助 SwiftUI 他们实现了对材质形状与光源的完全控制,避免依赖苹果系统 API 的限制。
SwiftUI
本文提到 SwiftUI 是 Liquid Glass 界面的底层框架。通过 Terminal 执行 defaults write 命令可设置 com.apple.SwiftUI.DisableSolarium 为 YES,从而完全关闭 Liquid Glass 效果,使界面恢复 macOS 15 风格的圆角和层级,但可能导致菜单栏和 Dock 出现显示问题。
SwiftUI
WKWebView 是 iOS 应用内嵌网页的主要组件。本文指出,只有将其中 WKPreferences 的 useSystemAppearance 私有属性设为 true,才能启用 -apple-visual-effect 来渲染 Liquid Glass 效果,但此做法会导致 App Store 审核失败。
WKWebView
本文中,WKPreferences 是配置 WKWebView 的类。通过将其私有属性 useSystemAppearance 设为 true,可让 WebView 支持苹果的液态玻璃 CSS 效果。若不开启则默认无效,且因该属性私有,实际 App 无法上架 App Store。
WKPreferences
文章指出 useSystemAppearance 是 WKPreferences 的私有开关。仅当其值为 true 时,-apple-visual-effect 属性才能在 WKWebView 内生效,实现 Liquid Glass 材质;默认关闭状态下无法使用,开发者也无法合法调用。
useSystemAppearance
WebKit 的 GitHub 仓库更新日志中出现将“hosted blur”材料重命名为“glass”的 PR,间接揭示了 -apple-visual-effect 私有 CSS 属性的存在。该属性允许 iOS webview 使用 Liquid Glass 及标准材质效果,文章作者通过跟踪此仓库获取 iOS 新特性情报。
WebKit
本文由 WebKit 团队发布,详细说明了 CSS random() 函数的实现细节与使用场景。WebKit 提供了星空、照片堆叠等演示案例,并通过 Safari Technology Preview 让开发者立即体验该功能,同时收集反馈以完善规范。
WebKit
本文将 Mac Catalyst 与 AppKit 并列,指出两者构建的全屏游戏在带 notch 的 MacBook 上都面临相同问题。系统 API 返回的分辨率列表未区分 notch 区域,导致多数游戏默认输出被拉伸压缩,画面模糊。
Mac Catalyst
本文指出,使用 AppKit 开发 Mac 全屏游戏时,需注意 notch 显示器导致的分辨率问题。CGDisplayCopyAllDisplayModes 返回的列表混杂了不可用全屏分辨率,游戏默认选取后会因高度压缩而渲染模糊。作者建议开发者用 safeAreaInsets 过滤出菜单栏下的正确 16:10 分辨率。
AppKit
本文中 SwiftUI 用于构建 iPhone 8 上的 OCR 服务器应用,实现处理状态仪表盘、请求统计卡片和电池监控界面。它与后台 HTTP 服务结合,展示每日请求量、平均处理时间和成功率等实时数据,同时支持持续运行和太阳能环境下的性能展示,成为用户窗口台的视觉化监控工具。
SwiftUI
本文中TCA是Arc浏览器早期采用的技术架构之一,与SwiftUI共同导致产品性能臃肿、响应迟缓。团队在开发Dia时决定彻底放弃TCA,转而采用更轻量的架构,以实现“快速响应”的基础体验。这反映了他们对Arc失败教训的总结:性能必须从底层重新设计,而非后期修补。
TCA
文章指出为解决Arc的性能问题,Dia放弃了TCA和SwiftUI,转而从架构层面重新设计以实现轻量、快速响应。这被列为Dia从Arc教训中吸取的三大改进之一,强调性能需作为产品基础而非事后补救。作者认为这是构建真正AI原生浏览器所必需的底层改变。
SwiftUI
Core Animation 负责图层合成与事务协调。GPUI 通过 CAMetalLayer 的 presentsWithTransaction 属性,将 Metal 呈现绑定到当前事务,确保直接模式下窗口内容与系统合成时序一致,减少了因异步呈现导致的延迟和不稳定。
Core Animation
AppKit 是 macOS 窗口与界面框架,负责触发窗口重绘。文中通过在 CAMetalLayer 上设置 presentsWithTransaction,使 AppKit 的重绘与 Metal 内容呈现保持同步,避免系统因内容未就绪而进行拉伸插值,从而消除了桌面应用场景下的视觉抖动。
AppKit
Swift是Fixr iOS应用采用的开发语言,Jacob在此项目中首次深度使用SwiftUI 1.0构建界面。项目中遇到地图与相机等原生组件集成难题,通过EnvironmentObject管理状态,最终形成可用的跨平台MVP。
Swift
本文中 SwiftUI 是作者为 Fixr 客户端与技工端 iOS App 构建 MVP 时首次使用的框架。作者在 1.0 版本中遇到 UIKit 互操作卡顿、状态传递困难、NavigationView 崩溃等问题,最终采用巨大的 EnvironmentObject 单例管理全局状态,所有页面跳转都退化为模态弹窗。SwiftUI 的早期不成熟直接影响了开发效率与代码架构,成为作者技术成长的关键经历。
SwiftUI
雅各布·巴特利特是本文作者与主角。2019年他从咨询公司顾问身份加入Fixr,逐步成为联合创始人兼CTO,与朋友Gus用11个月重写四款应用并推动MVP上线。产品因缺乏用户与团队问题失败后,他放弃股权转投Carbn,从中总结出初创公司多项红线。
Jacob Bartlett
本文中 WebKit 是率先完整实现 text-wrap: pretty 的浏览器引擎,它对整段文本而非仅末尾四行进行多行评估,以改善断行 ragged edge、避免孤行并减少连字符使用。Safari Technology Preview 216 已搭载该功能,且针对常规长度段落确保无性能损失,将网页排版从 1991 年以来的单行算法推进到段落级优化。
WebKit
本文分析显示,SwiftUI在2022年11月至2024年11月Stack Overflow问题数量下降幅度小于pandas、SQL等标签。文章将其归入受AI影响较小的开发框架类别,指出这类UI框架问题常涉及前端界面或需要截图说明,而AI回答难以充分支持。
SwiftUI
WebKit 是 Safari 的底层渲染引擎,在 18.4 版本中新增声明式 Web Push、shape() 函数等多项特性,同时移除旧接口并解决兼容问题。文章以 WebKit Features in Safari 18.4 为题,系统梳理了其在 CSS、HTML、媒体、JavaScript 等领域的具体改进。
WebKit
Predicate 是 LogUI 31 版用于筛选日志条目的核心机制。工具栏新增 Predicate 弹出菜单,提供 none、subsystem、eventMessage、processImagePath 等选项,以及 TimeMachineBasic 到 blowhole 的预设谓词。用户输入的文本不区分大小写,未来将加入实时谓词编辑器,目前修改仍需手动操作。
Predicate
文中指出若已安装 Xcode,Storage Settings 的 Developer 类别可清理构建文件和设备支持文件。该功能是 Storage Settings 提供的实用清理工具之一,能帮助释放启动卷空间,与 System Data 的模糊统计形成对比。
Xcode
本文提到 Xcode 会自动隔离图标中的 glyph 并应用着色,但对复杂图形处理效果不佳,易产生不一致结果。作者建议不要依赖自动转换,而应手动提供带 100% 至 60% 透明度渐变的灰度图像,以匹配 Apple 官方图标的暗黑与着色表现。使用 Sketch 的 Tint 功能可快速验证不同不透明度下的效果。
Xcode
文章标题与主题围绕此引擎的前缀CSS属性展开,讨论其在macOS上的字体平滑行为;虽起源于WebKit,但现代所有浏览器(含Firefox)均支持该属性,无需额外-moz前缀。
WebKit
本文详细介绍了作为Safari渲染引擎的WebKit在18.0版本中新增的53项Web平台特性、25项弃用以及209项问题修复。这些更新随Safari 18.0同步发布,覆盖CSS视图过渡、样式查询、WebXR沉浸式会话、Managed Media Source Workers支持等多项功能,并改进了与macOS、iOS等系统的集成。文章强调这些变化提升了网页性能、空间计算能力和开发者调试体验。
WebKit
本文在标签页和导航侧边栏两处使用 Xcode 作为实际案例,展示通过颜色与阴影区分活动标签,以及采用缩进树形结构呈现文件层次,帮助开发者快速把握项目组织并在多文件间切换。
Xcode
本文提到作者使用SwiftUI构建MercuryOS原型,以此验证滑动触发时机与响应式手势的实现差异。通过SwiftUI实践,作者发现轻量操作适合在滑动中途触发,而破坏性操作需等待手势结束,以避免误操作。文章以此说明技术实现细节如何影响最终交互的“自然感”。
SwiftUI
项目中作者用 Swift Charts 将 100-300 个运动数据点可视化,清晰看到 Y 轴加速度在俯卧撑时的 -1.0 下压峰值与 +0.5 回升峰值。通过观察图表将初始阈值微调为 -0.7 与 +0.4,提升了计数准确性。Swift Charts 仅用于数据探索与阈值验证阶段。
Swift Charts
SwiftUI 在本文中构建响应式界面,展示计数、启停按钮与姿势提示。采用 @Observable 宏的 PushupsDetector 类实现数据绑定,使 UI 随传感器更新自动刷新。作者认为其简洁性优于 UIKit,适合快速验证运动检测原型。
SwiftUI
本文作者,在推文中分享了使用SwiftUI进行交互设计原型制作的实践经验,重点讨论了其在苹果平台上的应用方式。
Jai Trivedi
本文中被提及为用于快速构建iOS与macOS交互原型的工具,作者展示了它如何帮助设计师实现动态界面效果与状态管理。
SwiftUI
iOS 17 中使用 SwiftUI 的二进制达到 385 个,较之前显著增长。Preferences、HealthUI、HomeUICommon 等多个系统 app 及其组件开始采用 SwiftUI,SwiftUI 专属应用生命周期的 app 增至 14 个。与 UIKit 对比显示,SwiftUI 占比持续上升,首次出现仅使用 UIKit 的二进制数量下降。
SwiftUI
本文分析了 iOS 17 内置应用的二进制文件,指出包含 Swift 代码的二进制数量较 iOS 16 增长 50%。Swift 被用于 Health、Home、Calendar 等多个重要应用及其 bundle 中,采用 SwiftUI 应用生命周期的 app 数量从 iOS 16 的 4 个增至 14 个。文章还确认 Swift 尚未进入 iOS 17 的 Secure Enclave,但已在 macOS Ventura 的 hibernation 二进制中使用。
Swift
本文中 AppKit 被提及用于对比,作者指出 SwiftUI 与 AppKit、UIKit 在组件与功能上仍有差距,但 SwiftUI 因其易用性与设计工具属性成为 Stocketa 主要开发框架。
AppKit
Paul为开发Stocketa从零学习Swift语言,搭配SwiftUI课程与自建项目同步实践,逐步掌握网络请求、数据持久化与后端集成等能力。两年间他持续重写模块以跟进语言与框架演进。
Swift
本文中 Hacking with Swift 是作者用于掌握 Swift 和 SwiftUI 基础的另一门课程,与 Design+Code 共同构成其项目驱动学习路径,最终支撑了 Stocketa 的两年开发。
Hacking with Swift
本文方法论部分引用作者此前对 macOS 中 AppKit、Mac Catalyst 与 SwiftUI 使用情况的分析,作为本次 iOS 17 统计的对比与方法依据。
AppKit
本文中 Core Data 是 Stocketa 早期数据持久化方案,作者先用其存储股票卡片数据,后迁移至 Firebase,以支持交易记录、成本基础计算及多用户同步等复杂需求。
Core Data
SwiftUI是Stocketa几乎全部界面的构建框架,Paul通过实际项目学习并不断重构代码以利用其最新特性如matchedGeometryEffect与overlayPreference。相比UIKit,它让设计师能快速实现原生交互与动画,成为项目核心技术选择。
SwiftUI
本文在方法论中提及此前对 macOS AppKit、Mac Catalyst 和 SwiftUI 的研究,作为 iOS 17 语言与 UI 框架统计的参考背景。
Mac Catalyst
文中说明 Safari 使用 WebKit 引擎,在 17.5 版本支持 light-dark(),并附上 WebKit 官方 issue 供开发者查看修复状态。
WebKit
本文介绍 WebKit 在 Safari 16.4 中的 135 项新功能与 280 项改进。重点包括 iOS/iPadOS 的 Web Push 支持、Web Components、CSS 新特性及 Web API 更新。WebKit 作为 Safari 的渲染引擎,直接负责这些跨平台特性的实现与优化。
WebKit
本文用Swift和iOS作为例子,说明ChatGPT对编程知识一无所知,其回答常包含语法完美但不存在的调用。这支持了禁止AI生成答案的理由,因为此类输出看似可信却完全错误,会误导用户。
Swift
WebKit 是 Safari 的核心引擎,本次更新涵盖 255892@main 至 256138@main 的提交。更新内容涉及 Web Inspector、CSS、渲染、媒体、JavaScript、WebCodecs 和 Web API 等多个模块,包含多项新特性和 bug 修复。
WebKit
本文中 WebKit 调整了脚本可写存储的处理规则,取消了 JavaScript 设置的 Cookie 7 天过期上限,转而将其纳入统一清理机制。该机制针对所有 WebKit 浏览器(含 Safari 及 iOS/iPadOS 浏览器应用),当网站在 7 天浏览器使用期间未收到用户交互时,即删除包括 Cookie 在内的所有脚本写入数据。文章指出此举使 JavaScript Cookie 在多数情况下比部分 HTTP 响应头 Cookie 更持久。
WebKit
本文详细介绍了 Safari 16.1 中 WebKit 新增的各项 Web 功能与修复。重点包括 macOS Ventura 上的 Web Push 支持、AVIF 动画图像、Passkeys 凭证、Scroll to Text Fragment 等特性,以及对 Interop 2022 测试通过率的提升。
WebKit
作者在新角色中除设计外,还会直接在Xcode中构建界面,以快速迭代和提升产品品质。他认为这种设计与工程紧密结合的方式,能更有效地把控最终交付质量,尤其在小团队中优势明显。
Xcode
本文中 WebKit 指 Safari 使用的浏览器引擎,其团队负责实现 :has() 伪类。他们开发了专用缓存与过滤优化,证明该选择器可在大型 DOM 树下保持极佳性能,并于 2021 年底起在自家产品中落地。
WebKit
作者使用 Xcode 14 测试版在 Ventura 测试环境下开发了自己的轻量虚拟机应用 Viable,所有测试结果均在 Monterey 12.4 的 Mac Studio 上运行得出。
Xcode
Xcode 是苹果的开发环境。本文中作者将 AHAP 触觉文件导入 Xcode,使 Not Boring Habits 应用能在 iOS 设备上播放为 checkbox 设计的自定义震动效果。
Xcode
本文指出 macOS 中的 WebView 基于 WebKit 渲染引擎,支持非标准 CSS 关键字以模拟系统字体和样式。作者观察到 WebKit 允许网页视图无缝融入原生应用界面,并推测这推动了 Safari/WebKit 对系统字体等特性的支持。
WebKit
本文中WebKit是PS3 XMB内置互联网浏览器的底层引擎。PS3Xploit利用其JavaScript环境实现用户态任意代码执行,进而通过ROP技术调用内核系统调用来修改Flash中的CoreOS文件,实现软件降级。该漏洞利用无需硬件辅助,是后期恢复自制程序支持的关键入口。
WebKit