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 的必經之路。