VoiceOver es un lector de pantalla integrado de Apple que vocaliza cada elemento de la interfaz y permite controlar el dispositivo mediante gestos. La tecnología está integrada en iOS, iPadOS y macOS a nivel de sistema y no requiere instalación de software adicional. Según Apple Accessibility (2025), VoiceOver admite más de 40 idiomas y es utilizado por millones de usuarios ciegos y con discapacidad visual en todo el mundo.
Puntos clave
VoiceOver es un lector de pantalla integrado en los sistemas operativos de Apple. Está diseñado para usuarios ciegos y con discapacidad visual y proporciona una interacción completa con el dispositivo sin contacto visual. VoiceOver vocaliza todos los elementos de la interfaz: botones, enlaces, texto, imágenes, notificaciones y elementos del sistema.
La tecnología se presentó por primera vez en 2005 para macOS, y apareció en iOS con el iPhone 3GS en 2009. Desde entonces, VoiceOver se ha convertido en una parte integral del ecosistema de Apple y uno de los principales argumentos a favor de la accesibilidad de la plataforma. VoiceOver está integrado a nivel de sistema, lo que significa que funciona en cualquier aplicación sin integración adicional por parte del desarrollador, aunque la calidad de la vocalización depende directamente de qué tan bien la aplicación utiliza la API de accesibilidad de iOS.
VoiceOver admite más de 40 idiomas con síntesis de voz natural y se adapta a la configuración regional de voz. En iOS, VoiceOver utiliza los motores de voz de Siri para el español y otros idiomas, lo que garantiza un sonido lo más natural posible y una entonación correcta según la puntuación y el contexto.
VoiceOver intercepta los eventos táctiles y los interpreta de manera diferente a la entrada estándar de iOS. Cuando un usuario toca la pantalla, VoiceOver no activa el elemento bajo el dedo, sino que primero lo vocaliza. Solo después de un doble toque se activa el elemento. Esta diferencia clave permite a los usuarios ciegos explorar la interfaz sin riesgo de clics accidentales.
VoiceOver lee los elementos de la interfaz en orden lógico: de izquierda a derecha, de arriba abajo. El orden de lectura se hereda de la jerarquía de vistas de iOS, pero el desarrollador puede cambiarlo mediante la propiedad accessibilityElements para diseños complejos. El usuario puede moverse entre elementos deslizando hacia la derecha (siguiente) y hacia la izquierda (anterior), así como tocar un elemento específico para que sea vocalizado.
Con cada movimiento, VoiceOver dice el tipo de elemento (botón, enlace, encabezado), su nombre (accessibilityLabel), estado (seleccionado, desactivado) y sugerencia (accessibilityHint). Si el elemento contiene un valor — por ejemplo, un control deslizante de volumen — VoiceOver también lo vocaliza. Los Accessibility Traits (UIAccessibilityTraits) informan adicionalmente al usuario sobre el comportamiento del elemento: si es un botón, interruptor, campo de búsqueda o tecla de teclado.
El rotor es un dial de ajuste virtual que cambia el modo de navegación de VoiceOver. El usuario gira el rotor con dos dedos (como una perilla de volumen) y selecciona un modo: palabras, caracteres, encabezados, enlaces, puntos de entrada, filas de tabla y otros. El modo de encabezados permite cambiar rápidamente entre H1-H6 en páginas web y aplicaciones, mientras que el modo de caracteres dice el texto letra por letra, útil al llenar formularios o ingresar códigos de verificación.
El desarrollador puede agregar modos personalizados al rotor a través de la API UIAccessibilityCustomRotor. Por ejemplo, en una aplicación de notas, se puede agregar un rotor de “Notas favoritas” o “Cambios recientes”. Los rotores personalizados aceleran significativamente la navegación en aplicaciones específicas y se consideran una mejor práctica de accesibilidad en iOS.
VoiceOver utiliza su propio conjunto de gestos que no coinciden con los gestos estándar de iOS. La mayoría de los gestos se realizan con tres dedos en lugar de uno — esto evita conflictos con la operación normal y permite que VoiceOver funcione simultáneamente con la entrada estándar.
| Acción | Gesto | Resultado |
|---|---|---|
| Vocalizar elemento | Toque con 1 dedo | Dice el nombre del elemento |
| Activar | Doble toque | Presiona botón o enlace |
| Siguiente elemento | Deslizar a la derecha | Ir al siguiente |
| Elemento anterior | Deslizar a la izquierda | Volver al anterior |
| Desplazar | Deslizar con 3 dedos | Desplazar lista o página |
| Rotor | Girar con 2 dedos | Cambiar modo de navegación |
El gesto de doble toque es la forma principal de activar elementos en VoiceOver. Si un elemento requiere una acción especial (por ejemplo, arrastrar), VoiceOver utiliza la secuencia “toque — doble toque y mantener” para entrar en modo de movimiento. Esto permite realizar gestos complejos como arrastrar y soltar sin ver la pantalla. VoiceOver también admite el gesto de “doble toque con dos dedos” para cancelar una acción y “triple toque” para activar/desactivar la Cortina de pantalla (Screen Curtain).
Un desarrollador de aplicaciones iOS puede mejorar significativamente la interacción con VoiceOver a través de la API UIAccessibility. La configuración básica de accesibilidad se agrega en Interface Builder (Identity Inspector → Accessibility), pero las interfaces complejas requieren configuración programática en código.
La propiedad accessibilityLabel establece el texto que VoiceOver dice para el elemento. Si no se establece una etiqueta, VoiceOver utiliza el texto del botón o el marcador de posición del campo de texto. Para elementos sin texto (iconos, vistas personalizadas), la etiqueta es obligatoria. La propiedad accessibilityTraits define el tipo de elemento: botón, encabezado, interruptor, campo de búsqueda, tecla de teclado, valor cambia, enlace y otros.
let profileButton = UIButton(type: .custom)
profileButton.setImage(UIImage(named: "avatar"), for: .normal)
profileButton.isAccessibilityElement = true
profileButton.accessibilityLabel = "Perfil de usuario"
profileButton.accessibilityTraits = .button
profileButton.accessibilityHint = "Abre la pantalla de configuración del perfil"
El indicador isAccessibilityElement habilita el soporte de VoiceOver para vistas personalizadas — por defecto es verdadero solo para elementos estándar (UIButton, UILabel, UITextField). El parámetro accessibilityHint agrega una sugerencia: VoiceOver la dice después de una pausa si el usuario se detiene en un elemento. La sugerencia debe describir el resultado de la acción, no la instrucción: “Abre la pantalla de configuración” en lugar de “Presione para abrir”.
Para pantallas complejas donde el grupo lógico de elementos no coincide con el orden visual, se utiliza accessibilityElements — un array que establece el orden de lectura. Por ejemplo, una tarjeta de producto contiene una imagen, nombre, precio y un botón “Agregar al carrito”. Si estos elementos están dispuestos de manera caótica en la jerarquía de vistas, accessibilityElements establece el orden correcto para VoiceOver.
let productCard = UIView()
let productImage = UIImageView()
let productName = UILabel()
let productPrice = UILabel()
let addToCartButton = UIButton()
productCard.accessibilityElements = [
productImage, productName, productPrice, addToCartButton
]
Para combinar varios elementos en un solo elemento accesible, se utiliza UIAccessibilityContainer o accessibilityFrame para anular el área táctil. Esto es útil cuando una celda de tabla contiene varios componentes de UI pero lógicamente representa un solo elemento — VoiceOver debe vocalizar toda la celda completa, no iterar a través de su contenido individualmente.
La configuración correcta de accesibilidad para VoiceOver requiere atención a varios aspectos: marcado semántico, actualizaciones dinámicas, manejo de elementos personalizados y pruebas con un lector de pantalla real.
En SwiftUI, la accesibilidad se configura mediante los modificadores .accessibilityLabel(), .accessibilityValue(), .accessibilityHint() y .accessibilityAddTraits(). SwiftUI hereda automáticamente la accesibilidad de los elementos estándar, pero los componentes personalizados requieren configuración explícita. Por ejemplo, un control deslizante personalizado debe informar su valor y formato de cambio a VoiceOver.
Slider(value: $volume, in: 0...100)
.accessibilityLabel("Volumen")
.accessibilityValue(
Text("\(Int(volume)) por ciento")
)
.accessibilityAddTraits(.adjustsAudioForAccessibility)
.accessibilityAdjustableAction { direction in
switch direction {
case .increment: volume = min(volume + 5, 100)
case .decrement: volume = max(volume - 5, 0)
}
}
El modificador accessibilityAdjustableAction agrega la capacidad de cambiar valores con gestos de VoiceOver: deslizar hacia arriba para aumentar, deslizar hacia abajo para disminuir. Sin este modificador, el control deslizante permanecerá inaccesible para el control del lector de pantalla. Se requiere una configuración similar para steppers personalizados, selectores y otros elementos que cambian su valor.
Cuando el contenido en la pantalla cambia dinámicamente (aparece una notificación, se actualiza el estado de carga, cambia un precio), VoiceOver debe recibir una notificación a través de UIAccessibility.post. Sin esta llamada, el lector de pantalla no sabrá sobre los cambios y el usuario se perderá información importante. Para SwiftUI, se utiliza el modificador .accessibilityAnnouncement().
UIAccessibility.post(
notification: .announcement,
argument: "Precio reducido en un 20 por ciento"
)
// SwiftUI
Text("Precio actualizado")
.accessibilityAnnouncement(Text("20% de descuento"))
Las notificaciones de VoiceOver deben usarse de manera reflexiva: los anuncios excesivos molestan al usuario, mientras que su ausencia hace que la aplicación sea inaccesible. La estrategia óptima es anunciar solo aquellos cambios que afectan el flujo de trabajo actual del usuario: actualizaciones del carrito, estado de carga, error de validación de formulario, notificación de chat. Los cambios de fondo (hora en el panel, tasas de moneda) no requieren anuncio — el usuario los verificará cuando sea necesario.
Las pruebas de VoiceOver se realizan utilizando un dispositivo físico con el lector de pantalla activado o un simulador de iOS con la opción Accessibility Inspector. Es importante probar escenarios de uso completo: completar un registro, realizar un pedido, encontrar un producto por búsqueda sin control visual. Si el flujo es navegable sin retroalimentación visual — VoiceOver está configurado correctamente.
Preguntas frecuentes
Configuración → Accesibilidad → VoiceOver. Active el interruptor. Para una activación rápida, use el triple clic del botón lateral (en iPhone X y posteriores) o el botón de inicio. Siri también puede activar VoiceOver con el comando “Activa VoiceOver”.
VoiceOver es el lector de pantalla de Apple para iOS, TalkBack es el lector de pantalla de Google para Android. El principio de funcionamiento es el mismo: tocar vocaliza, el doble toque activa. La diferencia está en los gestos, la configuración del rotor y las integraciones de ecosistema: VoiceOver está más profundamente integrado con iCloud y Apple Pay.
Use la API UIAccessibility: establezca accessibilityLabel para todos los elementos, accessibilityTraits para el tipo de elemento y accessibilityHint para sugerencias. En SwiftUI, use los modificadores .accessibilityLabel() y .accessibilityAddTraits(). Pruebe la aplicación con VoiceOver activado.
El rotor es un modo de navegación que se cambia girando dos dedos. Determina cómo moverse entre elementos: por encabezados, caracteres, palabras, enlaces o puntos de entrada. Los desarrolladores pueden agregar sus propios modos a través de UIAccessibilityCustomRotor.
Para UIView personalizado, debe establecer isAccessibilityElement = true y proporcionar accessibilityLabel. Si el elemento consta de varias vistas secundarias, use accessibilityElements para establecer el orden de lectura o combínelos en un contenedor.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también