iOS Accessibility 無障礙功能開發
Apple 極度重視無障礙體驗 (Accessibility),讓視障、聽障或行動不便的使用者也能順暢操作 App。支援 Accessibility 不僅是社會責任,通常也能讓你的 App 架構更好、測試更容易。
VoiceOver (旁白)
VoiceOver 是 iOS 內建的螢幕閱讀器。
常用修飾符
accessibilityLabel: 朗讀的內容(重要)。accessibilityHint: 提示操作後果。accessibilityValue: 目前的數值(例如 Slider 的百分比)。
Button(action: { bookmark() }) {
Image(systemName: "bookmark")
}
.accessibilityLabel("加入書籤")
.accessibilityHint("點擊兩下以儲存文章")
.accessibilityAddTraits(.isButton)
排序與隱藏
使用 accessibilitySortPriority 可以改變朗讀順序;使用 accessibilityHidden 可以讓 VoiceOver 忽略裝飾性圖片。
VStack {
Text("Title")
.accessibilitySortPriority(1) // 先讀
Image("decorative")
.accessibilityHidden(true) // 忽略
}
自定義動作 (Custom Actions)
對於複雜的列操作(如郵件的滑動刪除),我們可以定義 Custom Actions 讓盲人使用者透過「上下滑動」來選取動作。
Text("郵件標題")
.accessibilityAction(named: "刪除") {
deleteMail()
}
.accessibilityAction(named: "標示為未讀") {
markAsUnread()
}
Dynamic Type (動態字級)
App 應該要響應使用者的字體大小設定。
- 不要把字體大小寫死 (例如
.font(.system(size: 16)))。 - 要使用語意化字體樣式 (例如
.font(.body),.font(.headline))。
Text("隨著系統變大的字")
.font(.title) // 使用系統樣式
減少動態效果 (Reduce Motion)
有些使用者會因為過度的動畫產生暈眩。我們應該檢查 reduceMotion 環境變數。
@Environment(\.accessibilityReduceMotion) var reduceMotion
var body: some View {
MyView()
.transaction { transaction in
if reduceMotion {
transaction.animation = nil // 關閉動畫
}
}
}
對比度與顏色
確保文字與背景的顏色對比度足夠 (至少 4.5:1)。避免只用顏色來傳達訊息 (例如只用紅色代表錯誤),應該輔以圖示或文字說明,照顧色盲使用者。
支援 Accessibility 讓你的 App 充滿溫度,也是邁向頂尖 App 的必經之路。