VoiceOver là trình đọc màn hình tích hợp của Apple, đọc to từng phần tử giao diện và cho phép điều khiển thiết bị bằng cử chỉ. Công nghệ này được tích hợp vào iOS, iPadOS và macOS ở cấp hệ thống và không yêu cầu cài đặt thêm phần mềm. Theo Apple Accessibility (2025), VoiceOver hỗ trợ hơn 40 ngôn ngữ và được hàng triệu người dùng khiếm thị và mù trên toàn thế giới sử dụng.
Những điểm chính
VoiceOver là trình đọc màn hình được tích hợp trong hệ điều hành Apple. Nó được thiết kế cho người dùng khiếm thị và mù, cho phép tương tác đầy đủ với thiết bị mà không cần tiếp xúc thị giác. VoiceOver đọc to tất cả các phần tử giao diện: nút bấm, liên kết, văn bản, hình ảnh, thông báo và phần tử hệ thống.
Công nghệ này lần đầu tiên được giới thiệu vào năm 2005 cho macOS và xuất hiện trên iOS cùng với iPhone 3GS vào năm 2009. Kể từ đó, VoiceOver đã trở thành một phần không thể thiếu của hệ sinh thái Apple và là một trong những lý do chính ủng hộ khả năng tiếp cận của nền tảng. VoiceOver được tích hợp ở cấp hệ thống — nghĩa là nó hoạt động trong bất kỳ ứng dụng nào mà không cần tích hợp thêm từ nhà phát triển, mặc dù chất lượng đọc phụ thuộc trực tiếp vào mức độ ứng dụng sử dụng API trợ năng iOS.
VoiceOver hỗ trợ hơn 40 ngôn ngữ với tổng hợp giọng nói tự nhiên và thích ứng với cài đặt giọng nói khu vực. Trên iOS, VoiceOver sử dụng công cụ giọng nói Siri cho tiếng Việt và một số ngôn ngữ khác, đảm bảo âm thanh tự nhiên nhất và ngữ điệu chính xác tùy thuộc vào dấu câu và ngữ cảnh.
VoiceOver chặn các sự kiện chạm và diễn giải chúng khác với đầu vào iOS tiêu chuẩn. Khi người dùng chạm vào màn hình, VoiceOver không kích hoạt phần tử dưới ngón tay mà trước tiên đọc to nó. Chỉ sau khi chạm đúp, phần tử mới được kích hoạt. Sự khác biệt chính này cho phép người dùng khiếm thị khám phá giao diện mà không có nguy cơ nhấp nhầm.
VoiceOver đọc các phần tử giao diện theo thứ tự logic: từ trái sang phải, từ trên xuống dưới. Thứ tự đọc được kế thừa từ hệ thống phân cấp view iOS, nhưng nhà phát triển có thể thay đổi nó thông qua thuộc tính accessibilityElements cho các bố cục phức tạp. Người dùng có thể di chuyển giữa các phần tử bằng cách vuốt sang phải (tiếp theo) và sang trái (trước đó), cũng như chạm vào một phần tử cụ thể để được đọc to.
Mỗi lần di chuyển, VoiceOver đọc loại phần tử (nút, liên kết, tiêu đề), tên của nó (accessibilityLabel), trạng thái (đã chọn, vô hiệu hóa) và gợi ý (accessibilityHint). Nếu phần tử chứa một giá trị — ví dụ, thanh trượt âm lượng — VoiceOver cũng đọc to giá trị đó. Accessibility Traits (UIAccessibilityTraits) cung cấp thêm thông tin cho người dùng về hành vi của phần tử: nó là nút bấm, công tắc, trường tìm kiếm hay phím bàn phím.
Rotor là một núm điều chỉnh ảo chuyển đổi chế độ điều hướng VoiceOver. Người dùng xoay rotor bằng hai ngón tay (giống như núm âm lượng) và chọn chế độ: từ, ký tự, tiêu đề, liên kết, điểm vào, hàng bảng và các chế độ khác. Chế độ tiêu đề cho phép chuyển đổi nhanh giữa H1-H6 trên trang web và trong ứng dụng, trong khi chế độ ký tự đọc văn bản từng chữ một, hữu ích khi điền biểu mẫu hoặc nhập mã xác nhận.
Nhà phát triển có thể thêm chế độ tùy chỉnh vào rotor thông qua API UIAccessibilityCustomRotor. Ví dụ, trong ứng dụng ghi chú, có thể thêm rotor “Ghi chú yêu thích” hoặc “Thay đổi gần đây”. Rotor tùy chỉnh tăng tốc đáng kể việc điều hướng trong các ứng dụng cụ thể và được coi là thực hành tốt nhất về trợ năng trên iOS.
VoiceOver sử dụng bộ cử chỉ riêng không trùng với cử chỉ iOS tiêu chuẩn. Hầu hết các cử chỉ được thực hiện bằng ba ngón tay thay vì một — điều này ngăn xung đột với thao tác thông thường và cho phép VoiceOver hoạt động đồng thời với đầu vào tiêu chuẩn.
| Hành động | Cử chỉ | Kết quả |
|---|---|---|
| Đọc to phần tử | Chạm 1 ngón tay | Đọc tên phần tử |
| Kích hoạt | Chạm đúp | Nhấn nút hoặc liên kết |
| Phần tử tiếp theo | Vuốt sang phải | Chuyển đến phần tử tiếp theo |
| Phần tử trước đó | Vuốt sang trái | Quay lại phần tử trước |
| Cuộn | Vuốt 3 ngón tay | Cuộn danh sách hoặc trang |
| Rotor | Xoay 2 ngón tay | Chuyển chế độ điều hướng |
Cử chỉ chạm đúp là cách chính để kích hoạt các phần tử trong VoiceOver. Nếu một phần tử yêu cầu hành động đặc biệt (ví dụ: kéo), VoiceOver sử dụng chuỗi “chạm — chạm đúp và giữ” để vào chế độ di chuyển. Điều này cho phép thực hiện các cử chỉ phức tạp như kéo và thả mà không cần nhìn màn hình. VoiceOver cũng hỗ trợ cử chỉ “chạm đúp hai ngón tay” để hủy hành động và “chạm ba lần” để bật/tắt Màn hình che (Screen Curtain).
Nhà phát triển ứng dụng iOS có thể cải thiện đáng kể tương tác với VoiceOver thông qua API UIAccessibility. Các cài đặt trợ năng cơ bản được thêm trong Interface Builder (Identity Inspector → Accessibility), nhưng các giao diện phức tạp yêu cầu cấu hình lập trình trong mã.
Thuộc tính accessibilityLabel đặt văn bản mà VoiceOver đọc cho phần tử. Nếu không có nhãn nào được đặt, VoiceOver sử dụng văn bản nút hoặc văn bản giữ chỗ của trường văn bản. Đối với phần tử không có văn bản (biểu tượng, view tùy chỉnh), nhãn là bắt buộc. Thuộc tính accessibilityTraits xác định loại phần tử: nút bấm, tiêu đề, công tắc, trường tìm kiếm, phím bàn phím, giá trị thay đổi, liên kết và các loại khác.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Hồ sơ người dùng"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Mở màn hình cài đặt hồ sơ"
Cờ isAccessibilityElement bật hỗ trợ VoiceOver cho các view tùy chỉnh — mặc định nó chỉ đúng cho các phần tử tiêu chuẩn (UIButton, UILabel, UITextField). Tham số accessibilityHint thêm gợi ý: VoiceOver đọc gợi ý sau khi tạm dừng nếu người dùng dừng lại trên một phần tử. Gợi ý nên mô tả kết quả của hành động, không phải hướng dẫn: “Mở màn hình cài đặt” thay vì “Nhấn để mở”.
Đối với các màn hình phức tạp, nơi nhóm phần tử logic không khớp với thứ tự trực quan, accessibilityElements được sử dụng — một mảng xác định thứ tự đọc. Ví dụ, thẻ sản phẩm chứa hình ảnh, tên, giá và nút “Thêm vào giỏ hàng”. Nếu các phần tử này được sắp xếp hỗn loạn trong hệ thống phân cấp view, accessibilityElements thiết lập thứ tự chính xác cho VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
Để kết hợp nhiều phần tử thành một phần tử có thể truy cập duy nhất, UIAccessibilityContainer hoặc accessibilityFrame được sử dụng để ghi đè vùng chạm. Điều này hữu ích khi một ô bảng chứa nhiều thành phần UI nhưng về mặt logic đại diện cho một phần tử — VoiceOver nên đọc toàn bộ ô cùng một lúc, không duyệt qua nội dung riêng lẻ.
Cấu hình trợ năng chính xác cho VoiceOver đòi hỏi sự chú ý đến một số khía cạnh: đánh dấu ngữ nghĩa, cập nhật động, xử lý phần tử tùy chỉnh và kiểm tra với trình đọc màn hình thực tế.
Trong SwiftUI, trợ năng được cấu hình thông qua các bộ điều chỉnh .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() và .accessibilityAddTraits(). SwiftUI tự động kế thừa trợ năng từ các phần tử tiêu chuẩn, nhưng các thành phần tùy chỉnh yêu cầu cấu hình rõ ràng. Ví dụ, thanh trượt tùy chỉnh phải báo cho VoiceOver giá trị và định dạng thay đổi của nó.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Âm lượng")
.accessibilityValue(
Text("\(Int(volume)) phần trăm")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
Bộ điều chỉnh accessibilityAdjustableAction thêm khả năng thay đổi giá trị bằng cử chỉ VoiceOver: vuốt lên để tăng, vuốt xuống để giảm. Nếu không có bộ điều chỉnh này, thanh trượt sẽ không thể truy cập được để điều khiển bằng trình đọc màn hình. Cấu hình tương tự cũng cần thiết cho bộ tăng/giảm tùy chỉnh, bộ chọn và các phần tử khác thay đổi giá trị.
Khi nội dung trên màn hình thay đổi động (thông báo xuất hiện, trạng thái tải được cập nhật, giá thay đổi), VoiceOver phải nhận được thông báo qua UIAccessibility.post. Nếu không có lệnh gọi này, trình đọc màn hình sẽ không biết về các thay đổi và người dùng sẽ bỏ lỡ thông tin quan trọng. Đối với SwiftUI, bộ điều chỉnh .accessibilityAnnouncement() được sử dụng.
UIAccessibility.post(
notification: .announcement,
argument: "Giá đã giảm 20 phần trăm"
)
// SwiftUI
Text("Giá đã cập nhật")
.accessibilityAnnouncement(Text("Giảm 20%"))
Thông báo VoiceOver nên được sử dụng một cách hợp lý: thông báo quá nhiều làm phiền người dùng, trong khi thiếu thông báo khiến ứng dụng không thể truy cập được. Chiến lược tối ưu là chỉ thông báo những thay đổi ảnh hưởng đến quy trình làm việc hiện tại của người dùng: cập nhật giỏ hàng, trạng thái tải, lỗi xác thực biểu mẫu, thông báo trò chuyện. Thay đổi nền (thời gian trên bảng điều khiển, tỷ giá hối đoái) không cần thông báo — người dùng sẽ tự kiểm tra khi cần.
Kiểm tra VoiceOver được thực hiện trên thiết bị thực tế với trình đọc màn hình đã bật hoặc trình giả lập iOS với tùy chọn Accessibility Inspector. Điều quan trọng là kiểm tra các kịch bản sử dụng đầy đủ: hoàn tất đăng ký, đặt hàng, tìm sản phẩm qua tìm kiếm mà không cần kiểm soát trực quan. Nếu luồng có thể điều hướng mà không cần phản hồi trực quan — VoiceOver đã được cấu hình chính xác.
Câu hỏi thường gặp
Cài đặt → Trợ năng → VoiceOver. Bật công tắc. Để kích hoạt nhanh, nhấn ba lần nút bên cạnh (trên iPhone X trở lên) hoặc nút Home. Siri cũng có thể bật VoiceOver bằng lệnh “Bật VoiceOver”.
VoiceOver là trình đọc màn hình của Apple cho iOS, TalkBack là trình đọc màn hình của Google cho Android. Nguyên lý hoạt động giống nhau: chạm đọc, chạm đúp kích hoạt. Sự khác biệt nằm ở cử chỉ, cài đặt rotor và tích hợp hệ sinh thái: VoiceOver tích hợp sâu hơn với iCloud và Apple Pay.
Sử dụng API UIAccessibility: đặt accessibilityLabel cho tất cả phần tử, accessibilityTraits cho loại phần tử và accessibilityHint cho gợi ý. Trong SwiftUI, sử dụng bộ điều chỉnh .accessibilityLabel() và .accessibilityAddTraits(). Kiểm tra ứng dụng với VoiceOver đã bật.
Rotor là chế độ điều hướng được chuyển đổi bằng cách xoay hai ngón tay. Nó xác định cách di chuyển giữa các phần tử: theo tiêu đề, ký tự, từ, liên kết hoặc điểm vào. Nhà phát triển có thể thêm chế độ riêng thông qua UIAccessibilityCustomRotor.
Đối với UIView tùy chỉnh, cần đặt isAccessibilityElement = true và cung cấp accessibilityLabel. Nếu phần tử bao gồm nhiều view con, hãy sử dụng accessibilityElements để đặt thứ tự đọc hoặc kết hợp chúng vào một vùng chứa.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm