ios - pantalla - quitar voice over iphone 4s
Cambiar el orden de los elementos leĆdos con VoiceOver (8)
Ayer encontré una forma cómoda. Similar a la respuesta de @TejAces. Crea un nuevo archivo swift, luego copia estas cosas en él.
import UIKit
extension UIView {
func updateOrder(_ direction: Bool = true) {
var tempElements: [Any]? = [Any]()
let views = (direction) ? subviews : subviews.reversed()
for aView in views {
tempElements?.append(aView)
}
accessibilityElements = tempElements
}
}
class ReorderAccessibilityByStoryBoardView: UIView {
override func didAddSubview(_ subview: UIView) {
updateOrder()
}
}
Establezca la clase UIView (contiene las vistas que desea reordenar) como ReorderAccessibilityByStoryBoardView. Luego, puede reordenarlos reordenando la lista de vistas del guión gráfico.
Debido a que la subvista no contiene vistas en StackView / ScrollView, debe crear una clase independiente en este archivo. Como el ReorderAccessibilityByStoryBoardStackView abajo.
class ReorderAccessibilityByStoryBoardStackView: UIStackView {
override func didAddSubview(_ subview: UIView) {
updateOrder(false)
}
}
Con estos códigos, también puede reordenar el código agregado de la vista agregándolos en un orden específico.
Tengo un montón de botones en la pantalla que están posicionados visualmente de manera intuitiva, pero VoiceOver no los lee en un orden intuitivo. Esto se debe a que ciertos botones como Up y Dwon se colocan uno encima del otro y uno debajo del otro. Sin embargo, la voz en off comienza a leer de izquierda a derecha, de arriba a abajo, parece.
Esto hace que la voz en off lea el botón a la derecha de "Arriba" después de "Arriba", en lugar de leer "Abajo" inmediatamente después.
¿Cómo fuerzo la voz en off para leer el botón que quiero leer? Debo mencionar que estoy usando la función de deslizar el ciclo 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 botón iniciador que uso. Ignore la cantidad de píxeles. Sé que es una mala forma, pero estoy en un apuro 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;
}
Creo que puedes hacerlo en el guión gráfico. El orden de VoiceOver está determinado por el orden de las vistas en el esquema del documento.
Simplemente arrastre y suelte las vistas en la jerarquía de vistas en el orden correcto.
Editar:
Lo siento, no puedo publicar capturas de pantalla hasta 10 reputación. En el guión gráfico, el contorno del documento es el área de la izquierda donde se enumeran sus escenas con sus subvistas. Aquí, las subvistas se ordenan una debajo de la otra. Cuando cambie este orden, cambiará el orden de lectura de VoiceOver.
En Swift, solo tiene que establecer la propiedad de la matriz accessiblityElements de la vista:
view.accessibilityElements = [view1, view2, view3]
// orden 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 contenedora para la columna con el conjunto shouldGroupAccessibilityChildren
.
Desearía haberlo sabido antes, porque puede ser un dolor insertar contenedores de forma retroactiva en una situación de reproducción automática ...
Intenté la respuesta de Wesley de establecer el conjunto de elementos de accessibilityElements
pero no funcionó para mí.
Apple tiene alguna documentación que mejora la accesibilidad de las celdas de vista de tabla con un ejemplo en código. Básicamente, establece la etiqueta de accesibilidad de la celda (la vista principal) a los valores de las etiquetas de accesibilidad de las vistas secundarias.
[cell setAccessibilityLabel:[NSString stringWithFormat:@"%@, %@", cityLabel, temperatureLabel]];
Esto es lo que funcionó para mí.
La respuesta más fácil a esto radica en crear una subclase UIView
que contenga sus botones y responda 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 reordenar el enfoque de VoiceOver. Así que aquí hay un ejemplo de cómo crear una subclase UIView
que expone sus subvistas accesibles a VoiceOver por etiqueta.
AccesibilidadSubviewsOrderedByTag.h
#import <UIKit/UIKit.h>
@interface AccessibilitySubviewsOrderedByTag : UIView
@end
AccesibilidadSubviewsOrderedByTag.m
#import "AccessibilityDirectional.h"
@implementation AccessibilitySubviewsOrderedByTag {
NSMutableArray *_accessibilityElements;
}
//Lazy loading accessor, avoids instantiating in initWithCoder, initWithFrame, or init.
-(NSMutableArray *)accessibilityElements{
if (!_accessibilityElements){
_accessibilityElements = [[NSMutableArray alloc] init];
}
return _accessibilityElements;
}
// Required 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 NSOrderedAscending;
if (one > two) return NSOrderedDescending;
return NSOrderedSame;
}];
}
}
-(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 encierre sus botones en una instancia de esta vista, y establezca la propiedad de etiqueta en sus botones para que sea esencialmente el orden de enfoque.
Puede cambiar el orden configurando la matriz de accesibilidad 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 necesitas configurar la interacción habilitada programáticamente:
[self.view1 setUserInteractionEnabled:YES];
Si la vista está oculta, la voz en off no pasará a través de ella.
Sé que este es un hilo antiguo, pero encontré que la forma más fácil de hacerlo es subclase UIView como tal (Swift 3). Luego, simplemente modifique su tipo de UIView principal en el guión gráfico a AccessibiltySubviewsOrderedByTag y actualice las etiquetas en cada subvista que desee leer en orden.
clase AccessibilitySubviewsOrderedByTag: UIView {
override func layoutSubviews() {
self.accessibilityElements = [UIView]()
for accessibilitySubview in self.subviews {
if accessibilitySubview.isAccessibilityElement {
self.accessibilityElements?.append(accessibilitySubview)
}
}
self.accessibilityElements?.sort(by: {($0 as AnyObject).tag < ($1 as AnyObject).tag})
}
}