跳到主要内容

无障碍适配

问题

如何为 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 中越来越重视可访问性。做好无障碍适配不仅是合规要求,还能覆盖更多用户群体。

相关链接