无障碍适配
问题
如何为 iOS App 做无障碍(Accessibility)适配?
答案
核心属性
// UIKit
button.accessibilityLabel = "提交订单"
button.accessibilityHint = "双击提交当前购物车的订单"
button.accessibilityTraits = .button
button.isAccessibilityElement = true
// 自定义 View 组合多个子元素
containerView.isAccessibilityElement = true
containerView.accessibilityLabel = "商品:iPhone 16, 价格:7999元"
SwiftUI
struct ProductCard: View {
var body: some View {
VStack {
Text("iPhone 16").font(.headline)
Text("¥7999").font(.body)
}
.accessibilityElement(children: .combine)
.accessibilityLabel("iPhone 16, 价格 7999 元")
.accessibilityAddTraits(.isButton)
}
}
适配清单
| 类别 | 要求 |
|---|---|
| VoiceOver | 所有可交互元素有 accessibilityLabel |
| Dynamic Type | 支持系统字号缩放 |
| 色彩对比 | 文字与背景对比度 >= 4.5:1 |
| 减弱动效 | 尊重 UIAccessibility.isReduceMotionEnabled |
| 按钮尺寸 | 最小触摸区域 44×44pt |
Dynamic Type
// UIKit
label.font = UIFont.preferredFont(forTextStyle: .body)
label.adjustsFontForContentSizeCategory = true
// SwiftUI(自动支持)
Text("Hello").font(.body)
减弱动效
if UIAccessibility.isReduceMotionEnabled {
// 使用淡入淡出代替复杂动画
UIView.animate(withDuration: 0.2) { view.alpha = 1 }
} else {
// 正常动画
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.7, ...) { ... }
}
常见面试问题
Q1: 无障碍适配是法律要求吗?
答案:在美国,ADA(Americans with Disabilities Act)要求数字产品对残障人士可用,已有 App 因无障碍不达标被起诉。Apple 也在 App Review 中越来越重视可访问性。做好无障碍适配不仅是合规要求,还能覆盖更多用户群体。