Cambiar el order de los elementos de lectura con VoiceOver

Tengo un montón de botones en la pantalla que se posicionan intuitivamente visualmente, pero VoiceOver no los lee en un order intuitivo. Esto se debe a que ciertos botones como Up y Dwon se colocan arriba y debajo de cada uno. Sin embargo, la voz en off comienza a leer de izquierda a derecha, de arriba hacia abajo, parece.

Esto da lugar a la voz en off que lee el button a la derecha de "Arriba" después de "Arriba", en lugar de leer "Abajo" inmediatamente después.

¿Cómo forzo la voz en off para leer el button que quiero leer? Debo mencionar que estoy usando la function deslizar a través de los elementos en la voz en off.

Todos mis botones son versiones subclasificadas de UIView y UIButton. Aquí hay un ejemplo de un iniciador de button que uso. Ignore el recuento de píxeles: sé que es una mala forma, pero estoy en apuros en este momento:

UIButton* createSpecialButton(CGRect frame, NSString* imageName, NSString* activeImageName, id target, SEL obClickHandler) { UIButton* b = [UIButton buttonWithType:UIButtonTypeCustom]; [b setImage:[GlobalHelper nonCachedImage:imageName ofType:@"png"] forState:UIControlStateNormal]; [b setImage:[GlobalHelper nonCachedImage:activeImageName ofType:@"png"] forState:UIControlStateHighlighted]; [b addTarget:target action:obClickHandler forControlEvents:UIControlEventTouchUpInside]; b.frame= frame; return b; } - (UIButton *) createSendButton { CGFloat yMarker = 295; UIButton* b = createSpecialButton(CGRectMake(160, yMarker, 70, 45), @"Share_Btn", @"Share_Selected_Btn", self, @selector(sendAction)); b.accessibilityHint = @"Send it!"; b.accessibilityLabel = @"Stuff for voiceover to be added"; [self.view addSubview:b]; return b; } 

La respuesta más fácil a esto reside en la creación de una subclass UIView que contiene sus botones y responde de manera diferente a las llamadas de accesibilidad del sistema. Estas llamadas importantes son:

 -(NSInteger)accessibilityElementCount -(id)accessibilityElementAtIndex: -(NSInteger)indexOfAccessibilityElement: 

He visto algunas de estas preguntas y he respondido una antes , pero no he visto un ejemplo genérico de cómo reorderar el foco de VoiceOver. Así que aquí hay un ejemplo de cómo crear una subclass UIView que expone sus subvistas accesibles a VoiceOver por label.

AccesibilidadSubvencionesOrdenadoByTag.h

 #import <UIKit/UIKit.h> @interface AccessibilitySubviewsOrdenetworkingByTag : UIView @end 

AccesibilidadSubscripcionesOrdenadoByTag.m

 #import "AccessibilityDirectional.h" @implementation AccessibilitySubviewsOrdenetworkingByTag { NSMutableArray *_accessibilityElements; } //Lazy loading accessor, avoids instantiating in initWithCoder, initWithFrame, or init. -(NSMutableArray *)accessibilityElements{ if (!_accessibilityElements){ _accessibilityElements = [[NSMutableArray alloc] init]; } return _accessibilityElements; } // Requinetworking accessibility methods... -(BOOL)isAccessibilityElement{ return NO; } -(NSInteger)accessibilityElementCount{ return [self accessibilityElements].count; } -(id)accessibilityElementAtIndex:(NSInteger)index{ return [[self accessibilityElements] objectAtIndex:index]; } -(NSInteger)indexOfAccessibilityElement:(id)element{ return [[self accessibilityElements] indexOfObject:element]; } // Handle added and removed subviews... -(void)didAddSubview:(UIView *)subview{ [super didAddSubview:subview]; if ([subview isAccessibilityElement]){ // if the new subview is an accessibility element add it to the array and then sort the array. NSMutableArray *accessibilityElements = [self accessibilityElements]; [accessibilityElements addObject:subview]; [accessibilityElements sortUsingComparator:^NSComparisonResult(id obj1, id obj2){ // Here we'll sort using the tag, but really any sort is possible. NSInteger one = [(UIView *)obj1 tag]; NSInteger two = [(UIView *)obj2 tag]; if (one < two) return NSOrdenetworkingAscending; if (one > two) return NSOrdenetworkingDescending; return NSOrdenetworkingSame; }]; } } -(void)willRemoveSubview:(UIView *)subview{ [super willRemoveSubview:subview]; // Clean up the array. No check since removeObject: is a safe call. [[self accessibilityElements] removeObject:subview]; } @end 

Ahora simplemente incluya sus botones en una instancia de esta vista y establezca la propiedad de label en sus botones para que sea esencialmente el order de foco.

Puede cambiar el order de configuration de la matriz de accesibilidad de elementos de la vista:

 self.view.accessibilityElements = @[self.view1, self.view2, self.view3, self.view4]; 

o

 self.anotherView.accessibilityElements = @[self.label1, self.txtView1, self.label2, self.txtView2]; 

Si necesita configurar la interacción habilitada mediante progtwigción:

 [self.view1 setUserInteractionEnabled:YES]; 

Si la vista está oculta, la voz no pasará por ella.

Probé la respuesta de Wesley de establecer la matriz de los elementos de accessibilityElements pero no funcionó para mí.

Apple tiene cierta documentation para mejorar la accesibilidad de las celdas de vista de tabla con un ejemplo en el código. Básicamente, establece la label de accesibilidad de la celda (la vista principal) a los valores de las tags de accesibilidad de las vistas secundarias.

 [cell setAccessibilityLabel:[NSString stringWithFormat:@"%@, %@", cityLabel, temperatureLabel]]; 

Esto es lo que funcionó para mí.

Creo que puedes hacerlo en el guión gráfico. La order de VoiceOver está determinada por el order de las vistas en el esquema del documento.

Simplemente arrastre y suelte las vistas en la jerarquía de vista en el order correcto.

Editar:

Lo siento, no puedo publicar capturas de pantalla hasta 10 reputación. En el guión gráfico, el esquema del documento es el área de la izquierda donde se muestran las escenas con sus sub-vistas. Aquí, las subvenciones se piden una debajo de la otra. Cuando cambie este order, el order de lectura de VoiceOver cambiará.

En Swift, solo tiene que establecer la propiedad de matriz accessibilityElements de vista:

view.accessibilityElements = [view1, view2, view3] // order que desea tener

Esto no responde directamente a la pregunta original, pero responde al título de la pregunta:

Cuando quiero que VoiceOver deslice hacia abajo una columna, he estado usando una vista que contiene la columna con el set shouldGroupAccessibilityChildren .

Desearía haber sabido esto antes, porque puede ser un dolor insert retroactivamente los contenedores en una situación de autoajuste …