Loading...
Loading...
Compare original and translation side by side
// [VERIFY]| Situation | Required on first write |
|---|---|
| |
| Nothing extra — text is the label automatically |
| |
| |
| |
| Replace with |
| Color conveys state/status | Add shape, icon, or text alongside color |
| |
| Custom slider / toggle / stepper | |
| Async content change | Post announcement with availability guards ( |
System | Nothing extra — SwiftUI traps focus automatically (custom overlays still need focus management) |
| Use |
| Custom tappable view | |
| Any new SwiftUI view | Verify with Xcode Canvas Variants (see Accessibility Summary) |
| |
Custom | |
| AppKit modal/popup UI | Trap focus and ensure dismiss action is keyboard + VoiceOver reachable |
| Any new AppKit view/controller | Verify with Accessibility Inspector and full keyboard navigation |
ButtonToggleStepperSliderPickerTextFieldNSButtonNSPopUpButtonNSSliderNSSegmentedControlNSTextFieldNSViewButton {
shareAction()
} label: {
Image(systemName: "square.and.arrow.up")
}
.accessibilityLabel("Share") // [VERIFY] confirm label matches intent@Environment(\.accessibilityReduceMotion) private var reduceMotion
withAnimation(reduceMotion ? nil : .spring()) {
isExpanded.toggle()
}references/testing-auditing.md// [VERIFY]| 场景 | 首次编写时必须添加 |
|---|---|
| 带 |
| 无需额外操作——文本会自动作为标签 |
| |
| |
| |
| 替换为 |
| 颜色用于传达状态/状态信息 | 在颜色之外添加形状、图标或文本 |
非 | |
| 自定义滑块/开关/步进器 | |
| 异步内容变更 | 带版本兼容判断的公告推送(iOS 17+使用 |
系统 | 无需额外操作——SwiftUI会自动捕获焦点(自定义浮层仍需焦点管理) |
| 使用 |
| 自定义可点击视图 | |
| 任何新的SwiftUI视图 | 使用Xcode Canvas变体(查看无障碍摘要)进行验证 |
| 带 |
自定义 | |
| AppKit模态/弹窗UI | 捕获焦点并确保关闭操作可通过键盘和VoiceOver访问 |
| 任何新的AppKit视图/控制器 | 使用无障碍检查器和全键盘导航进行验证 |
ButtonToggleStepperSliderPickerTextFieldNSViewNSButtonNSPopUpButtonNSSliderNSSegmentedControlNSTextFieldButton {
shareAction()
} label: {
Image(systemName: "square.and.arrow.up")
}
.accessibilityLabel("Share") // [VERIFY] confirm label matches intent@Environment(\\.accessibilityReduceMotion) private var reduceMotion
withAnimation(reduceMotion ? nil : .spring()) {
isExpanded.toggle()
}references/testing-auditing.md#available#available#availableexamples/before-after-swiftui.mdexamples/before-after-uikit.mdexamples/before-after-appkit.mdreferences/platform-specifics.md#availableexamples/before-after-swiftui.mdexamples/before-after-uikit.mdexamples/before-after-appkit.mdreferences/platform-specifics.mdreferences/wcag-mapping.mdresources/qa-checklist.mdreferences/wcag-mapping.mdresources/qa-checklist.mdreferences/nutrition-labels.md**Accessibility Nutrition Label recommendation**
**App version evaluated:** [version or "Current build"]
**Scope reviewed:** [common tasks / screens evaluated]
**You could claim:**
- [labels where every common task is ✅ or —]
**Why you could claim them:**
- [label]: [brief reason tied to completed common-task coverage]
**You should not claim:**
- [labels blocked by any ❌]
- [labels that are not applicable]
**Why you should not claim them:**
- [label]: [blocked task or why the label is not applicable]
**Common-task verification**
| Common Task | VoiceOver | Voice Control | Larger Text | Dark Mode | No Color | Contrast | Motion | Captions | Audio Desc |
|---|---|---|---|---|---|---|---|---|---|
| [task] | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — |
**Recommendation summary**
- You could claim: [labels]
- You should not claim: [labels]—references/nutrition-labels.md**无障碍营养标签建议**
**评估的应用版本:** [版本号或"当前构建版本"]
**审核范围:** [评估的常见任务/界面]
**可申报的类别:**
- [所有常见任务均为✅或—的类别]
**可申报的原因:**
- [类别]:[与已完成的常见任务覆盖范围相关的简要理由]
**不可申报的类别:**
- [存在任何❌的类别]
- [不适用的类别]
**不可申报的原因:**
- [类别]:[阻塞的任务或类别不适用的原因]
**常见任务验证**
| 常见任务 | VoiceOver | Voice Control | 大字体 | 深色模式 | 无颜色 | 对比度 | 动态效果 | 字幕 | 音频描述 |
|---|---|---|---|---|---|---|---|---|---|
| [任务] | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — | ✅ / ❌ / — |
**建议总结**
- 可申报:[类别]
- 不可申报:[类别]—**Accessibility applied:**
- [one bullet per pattern added — e.g. "`.accessibilityLabel` on icon-only Share button"]
**Verify in Xcode:**
- Use Canvas **Dynamic Type Variants** (grid icon → Dynamic Type Variants) to check layout at all text sizes
- Use Canvas **Color Scheme Variants** to check light and dark mode
- Use **Accessibility Inspector** (Xcode → Open Developer Tool) Settings tab to simulate Increase Contrast, Reduce Motion, Bold Text on the Simulator
**If Xcode is unavailable:**
- Run equivalent checks with platform accessibility inspector tools and manual setting toggles (Dynamic Type, Contrast, Reduce Motion, VoiceOver/Voice Control)
**Test on device:**
- [relevant items from Must Test on Device checklist]**已应用的无障碍设计:**
- [每个添加的模式对应一个项目符号 — 例如"仅图标的分享按钮添加`.accessibilityLabel`"]
**在Xcode中验证:**
- 使用Canvas的**动态类型变体**(网格图标→动态类型变体)检查所有文本尺寸下的布局
- 使用Canvas的**颜色方案变体**检查浅色和深色模式
- 使用**无障碍检查器**(Xcode→打开开发者工具)的设置标签页,在模拟器上模拟增强对比度、减少动态效果、粗体文本
**如果无法使用Xcode:**
- 使用平台无障碍检查器工具和手动设置切换(动态类型、对比度、减少动态效果、VoiceOver/Voice Control)执行等效检查
**在设备上测试:**
- [来自设备必测清单的相关项]Must test on device: relevant items from the Review Checklist. Nutrition Label readiness: Achievable / Blocked by [issue] / Not applicable.
必须在设备上测试:来自审核清单的相关项。 营养标签准备情况:可实现 / 被[问题]阻塞 / 不适用。
.accessibilityLabelButton#available[VERIFY]square.and.arrow.upUIAccessibility.isVoiceOverRunningButton.accessibilityLabel#available[VERIFY]square.and.arrow.upUIAccessibility.isVoiceOverRunning.accessibilityLabel.accessibilityHidden(true).accessibilityAddTraits(.isSelected)"Selected photo".accessibilityElement(children: .combine)AccessibilityNotification.Announcement("Upload complete").post()UIAccessibility.post(notification: .announcement, argument: "Upload complete")references/voiceover-swiftui.mdreferences/voiceover-uikit.md.accessibilityLabel.accessibilityHidden(true).accessibilityAddTraits(.isSelected)"Selected photo".accessibilityElement(children: .combine)AccessibilityNotification.Announcement("上传完成").post()UIAccessibility.post(notification: .announcement, argument: "上传完成")references/voiceover-swiftui.mdreferences/voiceover-uikit.md.accessibilityInputLabels(["Compose", "New Message"]).accessibilityActionreferences/voice-control.md.accessibilityInputLabels(["Compose", "New Message"]).accessibilityActionreferences/voice-control.md.font(.body).font(.system(size: 16))@ScaledMetric(relativeTo: .body) var spacing: CGFloat = 8.accessibilityShowsLargeContentViewer()ViewThatFitsdynamicTypeSizereferences/dynamic-type.md.font(.body).font(.system(size: 16))@ScaledMetric(relativeTo: .body) var spacing: CGFloat = 8.accessibilityShowsLargeContentViewer()ViewThatFitsdynamicTypeSizereferences/dynamic-type.mdColor(.label).ultraThinMaterialreferences/display-settings.mdColor(.label).ultraThinMaterialreferences/display-settings.md.accessibilitySortPriority(_:).screenChangedaccessibilityViewIsModal = trueaccessibilityRotor(_:entries:)references/semantic-structure.md.accessibilitySortPriority(_:).screenChangedaccessibilityViewIsModal = trueaccessibilityRotor(_:entries:)references/semantic-structure.mdUIAccessibilityCustomActionreferences/motor-input.mdUIAccessibilityCustomActionreferences/motor-input.md| Modifier | Purpose |
|---|---|
| VoiceOver text for non-text elements |
| Brief result description |
| Current value (sliders, progress) |
| Hide decorative elements |
| Semantic role or state |
| Remove inherited trait |
| |
| Reading order (higher = earlier) |
| Named custom action |
| Increment/decrement |
| Voice Control alternate names |
| Programmatic focus |
| Custom VoiceOver rotor |
| Replace AX tree for custom controls |
| Protect images in Smart Invert |
| Large Content Viewer for fixed-size UI |
| 修饰符 | 用途 |
|---|---|
| 非文本元素的VoiceOver文本 |
| 简要的结果描述 |
| 当前值(滑块、进度条) |
| 隐藏装饰性元素 |
| 语义角色或状态 |
| 移除继承的特征 |
| |
| 阅读顺序(值越高越靠前) |
| 命名的自定义操作 |
| 递增/递减 |
| Voice Control替代名称 |
| 程序化焦点 |
| 自定义VoiceOver转子 |
| 替换自定义控件的AX树 |
| 在智能反转中保护图片 |
| 固定尺寸UI的大内容查看器 |
| Value | Purpose |
|---|---|
| Gate animations |
| Replace blur effects |
| Add non-color indicators |
| |
| Current text size |
| 值 | 用途 |
|---|---|
| 动态效果开关 |
| 替换模糊效果 |
| 添加非颜色指示器 |
| |
| 当前文本尺寸 |
| Label | Key APIs | Reference |
|---|---|---|
| VoiceOver | | |
| Voice Control | | |
| Larger Text | | |
| Dark Interface | | |
| Differentiate Without Color | shapes + color | |
| Sufficient Contrast | WCAG 4.5:1 text / 3:1 non-text | |
| Reduced Motion | | |
| Captions | | |
| Audio Descriptions | | |
| 标签 | 关键API | 参考 |
|---|---|---|
| VoiceOver | | |
| Voice Control | | |
| 大字体 | | |
| 深色界面 | | |
| 无颜色区分 | 形状+颜色 | |
| 足够对比度 | WCAG 4.5:1文本 / 3:1非文本 | |
| 减少动态效果 | | |
| 字幕 | | |
| 音频描述 | | |
.accessibilityLabel.accessibilityHidden(true)@ScaledMetricaccessibilityReduceMotion.accessibilityInputLabels.sheet()accessibilityViewIsModal.accessibilityActionAVPlayerViewController.accessibilityIgnoresInvertColors()performAccessibilityAudit()#available.accessibilityLabel.accessibilityHidden(true)@ScaledMetricaccessibilityReduceMotion.accessibilityInputLabels.sheet()accessibilityViewIsModal.accessibilityActionAVPlayerViewController.accessibilityIgnoresInvertColors()#availableperformAccessibilityAudit()references/testing-auditing.mdreferences/testing-auditing.mdreferences/voiceover-swiftui.mdreferences/voiceover-swiftui.mdreferences/voiceover-uikit.mdreferences/semantic-structure.mdreferences/voiceover-swiftui.mdreferences/voiceover-swiftui.mdreferences/voiceover-uikit.mdreferences/semantic-structure.mdreferences/voice-control.mdreferences/voice-control.mdreferences/motor-input.mdreferences/display-settings.mdreferences/semantic-structure.mdreferences/semantic-structure.mdreferences/voice-control.mdreferences/voice-control.mdreferences/motor-input.mdreferences/display-settings.mdreferences/semantic-structure.mdreferences/semantic-structure.mdreferences/dynamic-type.mdreferences/display-settings.mdreferences/display-settings.mdreferences/media-accessibility.mdreferences/platform-specifics.mdreferences/nutrition-labels.mdreferences/dynamic-type.mdreferences/display-settings.mdreferences/display-settings.mdreferences/media-accessibility.mdreferences/platform-specifics.mdreferences/nutrition-labels.mdimport SwiftUIimport UIKitimport AppKitUIAccessibilityNSAccessibilityimport SwiftUIimport UIKitimport AppKitUIAccessibilityNSAccessibility.accessibilityLabelButton("Save")Toggle("Dark Mode").accessibilityLabelButton("Save")Toggle("Dark Mode").accessibilityLabel.accessibilityLabel#availableAccessibilityNotification.Announcement("…").post()UIAccessibility.post(notification: .announcement, argument: "…")performAccessibilityAudit()ViewThatFits@Environment(\.dynamicTypeSize)if #available(iOS 17, macOS 14, tvOS 17, watchOS 10, visionOS 1, *) { ... }#availableAccessibilityNotification.Announcement("…").post()UIAccessibility.post(notification: .announcement, argument: "…")performAccessibilityAudit()ViewThatFits@Environment(\\.dynamicTypeSize)if #available(iOS 17, macOS 14, tvOS 17, watchOS 10, visionOS 1, *) { ... }.accessibilityLabel// [VERIFY]// [VERIFY] confirm label matches intentsquare.and.arrow.up.accessibilityLabel// [VERIFY]// [VERIFY] confirm label matches intentsquare.and.arrow.upreferences/voiceover-swiftui.mdreferences/voiceover-uikit.mdreferences/voice-control.mdreferences/motor-input.mdreferences/dynamic-type.mdreferences/display-settings.mdreferences/semantic-structure.mdreferences/media-accessibility.mdreferences/testing-auditing.mdperformAccessibilityAudit()references/nutrition-labels.mdreferences/wcag-mapping.mdreferences/assistive-access.mdreferences/platform-specifics.mdexamples/before-after-swiftui.mdexamples/before-after-uikit.mdexamples/before-after-appkit.mdresources/audit-template.swiftresources/qa-checklist.mdreferences/voiceover-swiftui.mdreferences/voiceover-uikit.mdreferences/voice-control.mdreferences/motor-input.mdreferences/dynamic-type.mdreferences/display-settings.mdreferences/semantic-structure.mdreferences/media-accessibility.mdreferences/testing-auditing.mdperformAccessibilityAudit()references/nutrition-labels.mdreferences/wcag-mapping.mdreferences/assistive-access.mdreferences/platform-specifics.mdexamples/before-after-swiftui.mdexamples/before-after-uikit.mdexamples/before-after-appkit.mdresources/audit-template.swiftresources/qa-checklist.md