SuperAPI AI 工具集

swiftui-responsive-layout

前端与建站

查看项目

更新于 10-16 06:08

技能介绍

SwiftUI Responsive Layout 是一个专注于跨尺寸适配与布局失败诊断的 SwiftUI 技能。其核心理念是:让界面响应它实际获得的空间和内容,然后去验证那些失败的配置,而不是根据设备名称来推断行为。

用途与范围 该技能负责跨尺寸适配和布局失败诊断,具体包括:内容被裁剪、非预期重叠、文本截断、控件跑到屏幕外、尺寸调整不稳定、键盘遮挡、安全区域处理错误,以及在 Dynamic Type 或本地化下失效的布局。

技能明确了边界:普通的 List、Form、网格、滚动视图、控件、搜索和覆盖层选择应交给 swiftui-layout-components;语义无障碍行为交给 ios-accessibility;本地化内容交给 ios-localization;导航结构交给 swiftui-navigation;布局成本测量或更新风暴交给 swiftui-performance。在使用带版本号的 API 前,应先检查部署目标和 SDK。除非请求的修复需要有意变更,否则应保留产品层级、状态归属、导航行为和无障碍契约。

诊断工作流

  1. 复现最小的失败配置:可用宽高、方向或窗口状态、Dynamic Type 尺寸、语言环境、键盘可见性,以及所在的导航或呈现容器。
  2. 从最近的稳定容器向外检查视图层级,识别谁提出尺寸、哪个子视图报告了不灵活的固有尺寸、是否有覆盖层或忽略安全区域绕过了正常布局。
  3. 在编辑前先分类原因:刚性尺寸、压缩竞争、结构分层、安全区域或键盘处理、内容增长、几何反馈,或错误的适配信号。
  4. 使用模式阶梯应用最窄的修复,避免针对特定设备的坐标分支和大范围重写。
  5. 验证原始失败以及相邻配置。在有状态内容处于活动状态时旋转或调整尺寸,以捕捉身份丢失和仅过渡期出现的失败。

适配信号的选择 优先选择最能表达需求的最局部信号:内容是否放得下或需要紧凑变体用 ViewThatFits;同一批子视图需要横向或纵向排列用 AnyLayout 配合堆栈布局;大区域在紧凑与常规空间之间改变结构用水平或垂直 size class;组件响应其实际容器尺寸用容器相对 API、聚焦的几何观察或自定义 Layout;文本或控件在无障碍尺寸下增长用 dynamicTypeSize、固有内容尺寸、换行和轴变化。size class 是环境类别,不是设备检测器或精确宽度;iPad 窗口可以在应用运行时改变大小。当断点属于某个组件而非整个场景时,应使用实际适配或容器空间。

模式阶梯 从灵活固有布局开始,只有在更简单层级无法表达设计时才升级:先移除不合理的固定宽高,使用固有尺寸、灵活框架、换行文本、标准间距和自适应网格项;再用 ViewThatFits 处理一小组有意义的有序变体;当同一批有状态子视图改变排列且应保留身份时用 AnyLayout;用 size class 处理紧凑单列与常规支持面板这类大结构变化;仅当行为依赖真实容器测量时,才使用聚焦几何观察或自定义 Layout。不要在修复布局契约之前用裁剪、缩放或更小字体来隐藏溢出。layoutPriority 可以解决已知的压缩偏好,但不能替代自适应结构。

文本、本地化与控件 让必要文本换行并垂直增长。将 lineLimit、fixedSize、minimumScaleFactor 和截断视为明确的产品决策。当横向行在较大 Dynamic Type 尺寸下无法保持可用时,改变轴或呈现方式。对需要跟随文本缩放的非文本尺寸使用 @ScaledMetric,对文本使用语义文本样式。预期翻译后的标签会变长,从右到左布局会反转阅读顺序,避免基于英文文案推导宽度假设。重排后保持控件可触达且尺寸可用,不要为了保持截图构图而把紧凑控件覆盖在内容之上。

安全区域、键盘与分层 将装饰性背景与交互内容分开,分别延伸到安全区域之外。对必须预留布局空间的持久栏或操作使用 safeAreaInset;覆盖层不预留空间,可能盖住最后的滚动内容。避免在根交互表面上大范围使用 ignoresSafeArea,只应用于预期的背景和边缘。在软件键盘可见时验证文本输入,优先使用可滚动的表单内容和系统键盘安全区域行为,而不是硬编码键盘高度。将 ZStack、overlay 和绝对偏移视为有意的分层工具,而不是通用的布局逃生舱。

几何与稳定性 避免把 GeometryReader 当作默认响应式容器,尤其是在重复的惰性单元格内。根据需求优先使用 ViewThatFits、containerRelativeFrame、聚焦的 onGeometryChange、preferences 或 Layout。当几何信息必须进入状态时,将其转换为所需的最小 Equatable 值,并把该状态保持在最窄的子树中。由几何推导的状态变化不得改变用于推导它的同一几何,否则视图可能振荡并持续重新布局。在适配过程中保留子视图身份,当两个分支代表同一批有状态控件时,优先改变布局容器而不是复制条件分支。

常见错误 根据 UIDevice 型号、屏幕边界或竖屏假设进行分支,而不是依据当前容器空间;组合固定框架、偏移和负内边距直到某张截图对齐;把底部操作放在覆盖层中而不为滚动内容预留空间;对整个交互层级应用 ignoresSafeArea;在无障碍文本尺寸下强制单行标签;在根部读取几何信息并通过共享应用状态发布每次变化;创建独立的紧凑和常规树,在调整尺寸时重置焦点、滚动位置或控件状态;只测试一个 iPhone 预览就宣称布局是响应式的。

审查清单 原始失败尺寸、内容和呈现状态已记录并复现;固定尺寸和偏移有明确的内容或平台理由;适配信号匹配局部需求而非设备型号;必要内容在支持的 Dynamic Type 尺寸下既不裁剪也不不可达;长本地化内容和从右到左内容保持层级和操作;持久栏预留空间并尊重安全区域、导航栏和键盘;旋转和实时 iPad 窗口调整尺寸保持状态并避免瞬时重叠;几何观察范围窄、稳定且无反馈循环;相关模拟器或预览矩阵有证据,而不仅仅是构建成功;无关的状态、导航、动画和架构仍由其所有者负责。

参考资料 技能列出了布局诊断与验证、自适应 SwiftUI 模式,以及 Apple 的 Layout fundamentals、Human Interface Guidelines — Layout、ViewThatFits、AnyLayout、UserInterfaceSizeClass 等参考。