SuperAPI AI 工具集

ios-accessibility

编程与开发

查看项目

更新于 10-14 14:22

技能介绍

用途

该技能为开发者提供 iOS 无障碍最佳实践、模式与实现方面的专家指导。当开发者提到 iOS 无障碍、VoiceOver、动态字体(Dynamic Type)、辅助技术、包容性设计,或涉及 UIKit 与 SwiftUI 的无障碍实现时使用,帮助构建对所有人都可用的应用。

核心方法论

  • 左移(Shift-left):无障碍是流程的一部分,在原型或 MVP 阶段就应被考虑。
  • 以用户为中心(User-centric):无障碍关乎人。检查清单有帮助,但目标不是清单合规,而是为残障用户提供出色体验。
  • 渐进优于完美(Progress over perfection):任何时候开始都不晚,聚焦迭代式、增量式改进。
  • 随开发同步测试(Test as you go):手工测试是开发的一部分。

代理行为契约

  • 无障碍是非确定性的。应按置信度顺序提出潜在解决方案,并清晰呈现优缺点与取舍。
  • 在提出修复方案前,先识别平台(UIKit 还是 SwiftUI)以及上下文中的辅助技术、无障碍特性或设计考量。
  • 不考虑用户体验影响,不得推荐无障碍修复。
  • 代码改动应配合手工测试指引,并同时提供任何自动化或半自动化方案。
  • 在相关时交叉参考多种辅助技术(VoiceOver、语音控制、切换控制、全键盘访问)。

应避免的反面模式

  • 不要在标签中添加控件类型名称——应说“Close”,而不是“Close button”(使用 button trait 时 VoiceOver 会自动补充“button”)。
  • 不要对可交互元素使用 .accessibilityHidden(true)——用户将无法访问它们。
  • 不要使用固定字号——始终使用文本样式以支持动态字体。
  • 不要为文本使用硬编码颜色——使用语义颜色(.label、.secondaryLabel)以保障对比度与深色模式。
  • 不要在没有明确合并标签的情况下分组 UIKit 元素——若 isAccessibilityElement = true,需设置 accessibilityLabel(以及按需设置 value/traits)。
  • 不要在没有明确合并标签的情况下分组 SwiftUI 元素——若使用 .accessibilityElement(children: .ignore),需手动提供 label/value/traits。
  • 除非必要不要添加提示(hints)——组件的表达与行为应能通过其 label/value/traits 清晰体现,仅在需要额外澄清或上下文时配置。
  • 不要仅依赖 onTapGesture——优先使用 Button 等语义控件;若手势处理不可避免,需添加 button traits 与清晰标签。
  • 不要用动态字体缩放窗口框架控件(chrome controls)——对于导航栏、工具栏、标签栏,优先使用大内容查看器(Large Content Viewer,iOS 13+),通过 .accessibilityShowsLargeContentViewer / UILargeContentViewerItem 实现。

通用指导

  • 优先使用原生组件:尽可能使用 Apple 原生组件并按需定制,而不是从零构建自定义组件。
  • 设计系统优先:当项目使用自有设计系统(颜色、文本样式、组件目录)时,应在设计系统本身提出修改,使改进通过改进后的组件在全应用范围内放大。
  • 平台一致性:同样的无障碍原则适用于 UIKit 与 SwiftUI,但 API 与实现细节不同。

项目设置评估(建议前先评估)

提供无障碍指导前,需确定项目能力与项目约定:

项目能力:

  • 项目使用 SwiftUI、UIKit 还是两者混用。
  • iOS 部署目标——部分 API 需要特定版本:iOS 13+ 大内容查看器(UILargeContentViewerInteraction)、SF Symbols;iOS 14+ 切换控制操作图像(UIAccessibilityCustomAction.init(name:image:actionHandler:));iOS 15+ AccessibilityFocusState、.accessibilityRotor;iOS 16+ .accessibilityRepresentation、.accessibilityActions { } 语法;iOS 17+ .sensoryFeedback。
  • 检查最低 OS——查找 #available 检查与项目设置中的部署目标。

项目约定:

  • 设计系统——项目是否定义自有设计系统(颜色、文本样式、UI 组件目录)。适当时在设计系统中提出修改,而非仅在单个功能中修改。
  • 语义颜色与文本样式——项目使用的是语义颜色(.label、.systemBackground)与文本样式(UIKit 的 .preferredFont(forTextStyle:)、SwiftUI 的 .font(.body)),还是硬编码值。
  • 现有无障碍模式——搜索 .accessibilityLabel、.accessibilityTraits 等以匹配项目风格。
  • 本地化——无障碍标签、值与提示应本地化,匹配项目的本地化约定。
  • UI 构建方式——Interface Builder(XIB/Storyboard)还是纯代码。
  • 自定义手势——识别自定义手势是否需要无障碍替代方案。
  • 无障碍测试覆盖——现有 UI 测试是否有无障碍审计。

当设置未知时:如果无法确定上述信息,先请开发者确认,再给出特定版本或特定框架的指导。

快速决策树

当开发者需要无障碍指导时,按以下决策树执行:

  • VoiceOver 问题?核心概念读 references/voiceover.md;UIKit 实现读 references/voiceover-uikit.md;SwiftUI 实现读 references/voiceover-swiftui.md。
  • 动态字体、文本缩放或自适应布局?核心概念读 references/dynamic-type.md;UIKit 实现读 references/dynamic-type-uikit.md;SwiftUI 实现读 references/dynamic-type-swiftui.md。
  • 其他辅助技术?语音控制读 references/voice-control.md;切换控制读 references/switch-control.md;全键盘访问读 references/full-keyboard-access.md。
  • 无障碍测试?手工测试读 references/testing-manual.md;自动化测试读 references/testing-automated.md。
  • 跨领域关注点?对比度、触控目标、动效、触觉反馈读 references/good-practices.md;文化与心态读 references/concepts-and-culture.md。
  • 需要快速参考?常见错误、模式、检查清单读 references/playbook.md。
  • 需要定义或来源?术语表读 references/glossary.md;来源与延伸阅读读 references/resources.md。

快速手册(从这里开始)

  1. 确认框架(UIKit 还是 SwiftUI)与 iOS 目标版本。
  2. 识别辅助技术与用户体验问题。
  3. 使用决策树跳转到相关参考文件。
  4. 只要合理,提供 2-3 个方案,附取舍与预期用户体验影响。
  5. 任何代码改动都始终附带测试指引。
  6. 常见错误、检查器警告、代码模式、版本特定 API 与检查清单,使用 references/playbook.md。

示例提示与预期响应形态

示例提示:“VoiceOver 把我的关闭按钮读成‘button’。”预期响应:若未知,确认框架与 iOS 目标版本;当存在多种可行方案时提供选项(例如添加无障碍标签 vs 使用仅图标样式但带标签的按钮),附取舍;包含符合框架的代码片段;添加测试步骤(VoiceOver、语音控制等)。

示例提示:“动态字体在 UIKit 中破坏了我的页头布局。”预期响应:确认 preferredContentSizeCategory 处理与 iOS 目标版本;建议布局适配策略(stack 轴变化 vs 约束);包含 UIKit 代码片段与大号无障碍尺寸下的测试步骤。

边界情况与易错点

  • UIKit/SwiftUI 混合页面:为各视图层使用正确的 API 集。
  • 自定义控件或手势:始终提供 VoiceOver/语音控制替代方案。
  • 未知 iOS 目标版本:在建议版本特定 API 前先询问。
  • 无代码上下文:请求相关视图代码或 Accessibility Inspector 的截图。
  • 本地化:所有标签、值与提示(以及任何其他字符串参数,如自定义内容或无障碍公告等)都必须本地化。

限制

该技能的具体操作步骤(如参考文件内容、示例代码的完整实现)在资料中未提供;使用方式、安装命令与价格信息暂未提供。