¿VoiceOver lee tags en la vista anterior en la aplicación de iPhone? ¿error?

Estoy creando una aplicación basada en vista, donde iré a la siguiente vista, a través del método addSubview . El problema es que cuando activo la function de VoiceOver y agrego las vistas, toma las tags de accesorios de las vistas anteriores. Es decir, si hago clic en la vista en el rect, donde hay label en la vista previa, también, VoiceOver lo detectará como label de accesibilidad y comenzará a leer esa label. Pero, si uso, el controller de navigation para ir al siguiente controller de vista, no tengo ningún problema. ¿Alguien puede decírmelo, si Apple sí mismo ha admitido la installation de VoiceOver solo para aplicaciones basadas en navigation, o hay alguna otra solución para VoiceOver en aplicaciones basadas en la vista?

PS He probado lo mismo en algunas aplicaciones de demostración también, pero los mismos resultados.

Entonces, cuando en la vista actual estoy agregando una subvista que contiene botones, la accesibilidad también lee las tags detrás de la subvista. Quiero la accesibilidad para leer botones en la vista agregada, y el rest de la parte visible de la vista previa solamente (y no las tags se ocultaron detrás de la vista agregada). ¿Puede alguien decir, si se trata de un error de voz en off en el iPhone, que de forma pnetworkingeterminada, lee las tags de parentView también en addubview?

Use esta notificación de cambio de pantalla

 UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); 

si necesita enfocar un object / vista específico, pase esos en el lugar de cero.

Si una vista está en la jerarquía de la vista, incluso si está oscurecida por otra vista encima de ella, VoiceOver detectará eso.

No deberías moverte a otra pantalla de contenido simplemente agregando una nueva vista sobre la anterior. Cada pantalla de su aplicación debe ser UIViewController , no solo una UIView simple. Esto le ofrece muchas ventajas, una de las cuales es que un controller de vista puede download automáticamente su vista cuando está fuera de la pantalla y hay una advertencia de memory.

Para administrar las transiciones entre las pantallas de su aplicación, debe usar un controller de contenedor como un controller de navigation (o uno propio). Puede deshabilitar la barra de navigation y los efectos de transición si lo desea, y simplemente utilizarlo para administrar su stack de vistas. Cuando presiona un nuevo controller de vista en la stack, el anterior se eliminará y su problema desaparecerá.

Por lo tanto, debería reconsiderar seriamente la forma en que está administrando sus pantallas y vistas. UIViewController dentro de algún tipo de contenedor es el path a seguir. Como mínimo, debería eliminar la vista anterior cuando agrega una nueva a la pantalla.

Tuve el mismo problema que tú, y pasé un time para resolver esto. Cuando agrega la vista B sobre la vista A, no oculta la vista A. La vista continúa allí, y como lo espera vozOver, leerá esa vista / label.

Puede usar la Vista de debugging que Xcode proporciona para usted, para ver este tipo de problema. Le escribí un ejemplo para demostrarle cómo voiceOver ve sus tags.

Cuando usa addSubview, su jerarquía de vistas es así:

visión de conjunto

Entonces, en este caso, la vista del contenedor, ¡con Hello Stack! La label está sobre la label Hello World. Como usuario, no puede ver la label Hello World. Sin embargo voiceOver puede ver esa vista.

Muy bien, ahora que se conoce el problema, la solución es: cuando quiera agregar una vista sobre otra, primero oculte la vista anterior. A continuación, utilice la Vista de debugging de xcode para ver cómo son sus vistas.

Lo soluciono para mostrarle cómo corregir el error que demostré:

En codigo: introduzca la descripción de la imagen aquí

Vista de debugging:

  • primera label: postimg.org/image/cabhadzrl/
  • segunda label: postimg.org/image/nsldgjb41/5605fbcd/

Si observas, he agregado un contenedor de vistas entre las tags, pero esta vista es solo para mejorar la visión de la jerarquía.

Puede establecer la propiedad accessibilityViewIsModal de la vista en YES.

@property (nonatomic) BOOL accesibilityViewIsModal NS_AVAILABLE_IOS (5_0);

Informa si la vista receptora debe considerarse modal por accesibilidad. Si es SÍ, se ignorarán los elementos que se encuentren fuera de esta vista. Solo los elementos dentro de esta vista estarán expuestos. default == NO

así que cualquiera sea la vista que esté agregando, configure su accessibilityViewIsModal a YES / true.

view.accessibilityViewIsModal = YES