内容提要
本文为iOS 26 UIKitCore逆向分析报告,重点解析导航栏标题字体与过渡动画、滚动边缘模糊效果、Tab Bar和分段控件的Liquid Glass交互,并详述相关Spring参数。文章记录了各控件的内部实现、关键数值及调用链,并提供复刻实验的代码参考。
延伸解读
字体细节:Semibold 与 Bold 的区分
文章指出,UIKit 的 inline 标题在 UICTFont 描述中显示为 bold,但实际 descriptor 中的 weight trait 是 0.3,对应 semibold 而非 bold。Large title 的 trait 约为 0.4,而 large subtitle 约为 0.23(medium)。开发者若自绘标题,需注意使用正确的 weight,否则视觉上会有细微差异。
标题过渡动画的 Spring 参数
iOS 26.5 的标题过渡由 _UINavigationBarTitleTransitionSpec 控制,包含 alpha、blur 和位移三个维度。默认参数中,blur 从 4pt 降至 0,y 位移从 15pt 归零,并采用双 Spring 驱动。速度归一化后决定时长因子和 bounce,快 Spring 控制 alpha 和 blur,慢 Spring 控制 y 位移。复刻时需注意动画合成顺序,否则可能只看到淡入效果。
Scroll Edge 模糊与 Pocket 机制
滚动边缘模糊使用 variableBlur,与标题的 gaussianBlur 不同。Pocket 的默认尺寸为 18pt,扩展倍率 2.7,最终约 49pt,但实际效果受内容 inset 和 overlap 影响。Pocket 形状由标题、按钮等元素贡献,而非整个导航栏。隐藏标题时应使用 isHidden 而非仅设 alpha=0,否则仍会占据 pocket 空间。
Liquid Glass 交互的层级与参数
Tab Bar 的选中效果涉及 _UITabBarPlatterView、_UITabSelectionView 和 _UILiquidLensView 的协同,需要同时驱动背景 trait、lens 状态和 platter 尺寸。Segmented Control 的 indicator 跟随需要处理 UIKit 内部 layout 后的位置覆盖。Liquid Lens 的 Spring 参数因 variant 而异,不能直接套用默认值。
Q&A
iOS 26 导航栏普通标题的默认字体是什么?
在 iOS 26.5 中,导航栏普通标题(inline title)的默认字体是 UICTFontTextStyleHeadline,在默认内容大小类别下为 17pt Semibold。
iOS 26 导航栏标题从大标题过渡到内联标题时,动画包含哪些属性变化?
当大标题跨过折叠阈值后,内联标题会同时发生三件事:alpha 上升、gaussian blur 从 4 降到 0、位置从下方 15pt 回到原位。这些由 _UINavigationBarTitleTransitionSpec 控制。
iOS 26 导航栏标题过渡动画的 Spring 参数有哪些?
iOS 26.5 中,标题过渡使用两条 Spring:快 Spring 驱动 alpha 和 blur,慢 Spring 驱动 y 位移。具体参数包括 maxScrollVelocity=2000、bounceFactor=0.4、minDurationFactor=0.5、maxDurationFactor=1.0、fastDuration=0.45s、slowDuration=0.7s、blurRadius=4pt、hiddenYOffset=15pt。
iOS 26 滚动边缘模糊效果与标题模糊有何不同?
标题模糊使用标题 layer 上的 gaussianBlur,而滚动内容进入导航区域时使用的是 variableBlur。两者同时出现在屏幕顶部,但不是同一条动画,也不应该用一块全宽毛玻璃背景代替。
iOS 26 Tab Bar 选中项的 Liquid Glass 提升效果是如何实现的?
Tab Bar 选中项的提升需要三部分协同:_UITabBackgroundScaleTrait 驱动背景状态切换、_UILiquidLensView.setLifted 驱动 lens、以及扩大选中 platter(selection bounds 向外 inset -8pt)。只放大 icon 或只调用 lens selector 都无法得到完整效果。
iOS 26 分段控件(Segmented Control)的连续 indicator 是如何跟随触摸的?
分段控件的触摸高亮通过调用链 touchesBegan -> _tapSegmentAtPoint: -> _highlightSegment: -> _updateSelectionIndicator -> _updateSelectionToSegment: 最终调用 _UILiquidLensView.setLifted 来实现。为了跟随 Page View,可以将页面坐标定义为 0...numberOfSegments-1,在相邻 segment frame 间插值,并保留 UIKit 自己的 lens inset。
_UILiquidLensViewVariantSpec 中 Lift 和 Unlift 的 Spring 参数默认值是什么?
基础默认值中,Lift 的 Spring 参数为 damping ratio 0.625、response 0.27s、retarget impulse 0.032;Unlift 为 damping ratio 0.7、response 0.5s、retarget impulse 0.016。Large variant 会覆盖部分配置,如 Lift 和 Unlift 的 damping/response/impulse 均为 1.0/0.25s/0。