segmented how example custom control ios accessibility uisegmentedcontrol kif-framework

ios - how - ¿Cómo configuro la etiqueta de accesibilidad para un segmento en particular de un UISegmentedControl?



uisegmentedcontrol example (10)

Esta es una pregunta antigua, pero en caso de que alguien más se tope con esto, descubrí que los segmentos tenían automáticamente una etiqueta de accesibilidad especificada como texto.

Más allá de la respuesta de Stuart, me pareció muy útil al escribir casos de prueba para activar el "Inspector de accesibilidad" en el simulador (Configuración -> General -> Accesibilidad -> Inspector de accesibilidad). Se sorprendería de la cantidad de elementos que ya tienen etiquetas de accesibilidad incluidas, como en los elementos estándar de la interfaz de usuario de iOS o incluso en marcos de terceros.

Nota : los gestos ahora serán diferentes: toque para ver información de accesibilidad, toque dos veces para seleccionar. Minimizar la ventana del Inspector de accesibilidad (tocando el botón X) devolverá los gestos a la normalidad.

Usamos KIF para nuestras pruebas funcionales, y usa la etiqueta de accesibilidad de los elementos para determinar dónde enviar los eventos. Actualmente estoy intentando probar el comportamiento de un UISegmentedControl, pero para hacerlo necesito establecer diferentes etiquetas de accesibilidad para los diferentes segmentos del control. ¿Cómo configuro la etiqueta de accesibilidad para un segmento en particular?


¿Quieren ver cómo Apple recomienda que se haga?

Es FUGLY.

Esto es de este ejemplo :

func configureCustomSegmentsSegmentedControl() { let imageToAccessibilityLabelMappings = [ "checkmark_icon": NSLocalizedString("Done", comment: ""), "search_icon": NSLocalizedString("Search", comment: ""), "tools_icon": NSLocalizedString("Settings", comment: "") ] // Guarantee that the segments show up in the same order. var sortedSegmentImageNames = Array(imageToAccessibilityLabelMappings.keys) sortedSegmentImageNames.sort { lhs, rhs in return lhs.localizedStandardCompare(rhs) == ComparisonResult.orderedAscending } for (idx, segmentImageName) in sortedSegmentImageNames.enumerated() { let image = UIImage(named: segmentImageName)! image.accessibilityLabel = imageToAccessibilityLabelMappings[segmentImageName] customSegmentsSegmentedControl.setImage(image, forSegmentAt: idx) } customSegmentsSegmentedControl.selectedSegmentIndex = 0 customSegmentsSegmentedControl.addTarget(self, action: #selector(SegmentedControlViewController.selectedSegmentDidChange(_:)), for: .valueChanged) }

Aplican las etiquetas de accesibilidad a las imágenes y luego adjuntan las imágenes. No es muy diferente de la respuesta anterior .


Cada segmento de UISegmentedControl es UISegment instancia de la clase UISegment que subclase de UIImageView . Puede acceder a esas instancias mediante la propiedad de UISegmentedControl e intentar agregar accesibilidad mediante programación.


Como dijo Vertex,

obj-c

[[[self.segmentOutlet subviews] objectAtIndex:3] setAccessibilityLabel:@"GENERAL_SEGMENT"];

rápido

self.segmentOutlet.subviews[3].accessibilityLabel = "GENERAL_SEGMENT"

Algunos consejos para que no te vuelvas loco como yo lo hice:

  1. Para desplazarse en el modo de accesibilidad deslice tres dedos
  2. Los índices de los segmentos están al revés de lo que cabría esperar, es decir, el segmento más a la derecha es el índice 0 y el más a la izquierda es el índice n ''donde n es el número de elementos en el control UISegmentControl

Como dijo Vortex, la matriz está de derecha a izquierda con [0] comenzando por la derecha. Puede configurar cada opción de accesibilidad individual accediendo a las subvistas. Dado que las subvistas son opcionales, es bueno sacar primero la subvista y luego asignar los rasgos de accesibilidad que desee. Ejemplo de Swift 4 para un control de segmento de dos opciones simple:

override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() guard let rightSegment = segmentControl.subviews.first, let leftSegment = segmentControl.subviews.last else { return } rightSegment.accessibilityLabel = "A label for the right segment." rightSegment.accessibilityHint = "A hint for the right segment." leftSegment.accessibilityLabel = "A label for the left segment." leftSegment.accessibilityHint = "A hint for the left segment." }


Esta es una pregunta antigua, pero en caso de que alguien más se tope con esto, descubrí que los segmentos tenían automáticamente una etiqueta de accesibilidad especificada como texto. Entonces, si se agregaron dos opciones de Opción 1 y Opción 2. Una llamada a

[tester tapViewWithAccessibilityLabel:@"Option 2"];

Seleccioné exitosamente el segmento.


Estoy empezando con KIF, así que no he probado esto, pero vale la pena intentarlo. Estoy seguro de que tendré el mismo problema pronto, así que me interesaría saber si funciona.

Primero, UIAccessibility Protocol Reference tiene una nota bajo accessibilityLabel que dice:

"Si suministra objetos UIImage para mostrarlos en un UISegmentedControl, puede configurar esta propiedad en cada imagen para garantizar que los segmentos estén correctamente accesibles".

Por lo tanto, me pregunto si podría establecer también el accessibilityLabel en cada objeto NSString y poder usarlo para acceder a cada segmento con KIF. Para empezar, puede intentar crear un par de cadenas, establecer sus etiquetas de accesibilidad y usar [[UISegmentedControl alloc] initWithItems: myStringArray]; para poblarlo.

Por favor, infórmenos sobre su progreso. Me gustaría saber cómo va esto


No puede confiar en el índice en la subviewsarray para la posición. Para la personalización de las subvistas individuales, ordeno las subvistas en su posición X antes de configurar cualquier propiedad. Lo que también sería válido para accesibilityLbel.

let sortedViews = self.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } ) sortedViews[0].accessibilityLabel = "segment_full" sortedViews[1].accessibilityLabel = "segment_not_full"


Otra opción, si no está dispuesta a establecer la etiqueta de accesibilidad, podría ser calcular el impulso de cada parte del segmento y utilizarlo.

[tester tapScreenAtPoint:segementPosition];

para desencadenar las acciones


Si observa el control segmentado a través del inspector de accesibilidad, encontrará que los segmentos son objetos UISegment. Además, resultan ser subvistas directas del UISegmentedControl. Ese hecho sugiere el siguiente código Swift 4 increíblemente loco pero perfectamente seguro para establecer las etiquetas de accesibilidad de los segmentos de un UISegmentedControl:

let seg = // the UISegmentedControl if let segclass = NSClassFromString("UISegment") { let segments = seg.subviews.filter {type(of:$0) == segclass} .sorted {$0.frame.minX < $1.frame.minX} let labels = ["Previous article", "Next article"] // or whatever for pair in zip(segments,labels) { pair.0.accessibilityLabel = pair.1 } }