如何为UISegmentedControl的特定段设置辅助功能标签?

Sim*_*mon 19 accessibility uisegmentedcontrol ios kif-framework

我们使用KIF进行功能测试,并使用元素的可访问性标签来确定发送事件的位置.我目前正在尝试测试UISegmentedControl的行为,但为了做到这一点,我需要为控件的不同段设置不同的可访问性标签.如何为特定细分设置可访问性标签?

and*_*ers 19

正如Vertex所说,

OBJ-C

[[[self.segmentOutlet subviews] objectAtIndex:3] setAccessibilityLabel:@"GENERAL_SEGMENT"];
Run Code Online (Sandbox Code Playgroud)

迅速

self.segmentOutlet.subviews[3].accessibilityLabel = "GENERAL_SEGMENT"
Run Code Online (Sandbox Code Playgroud)

一些建议,所以你不要像我一样疯狂:

  1. 要在辅助功能模式下滚动,请滑动三根手指
  2. 段的索引比你预期的要落后,即右边最远的段是第0个索引,最左边是第n个索引,其中n是UISegmentControl中的元素个数


jma*_*mac 10

我自己刚刚开始使用KIF,所以我没有测试过这个,但它可能值得一试.我相信我很快就会遇到同样的问题,所以我很想知道它是否有效.

首先,UIAccessibility Protocol Reference在accessibilityLabel下有一条说明:

"如果提供UIImage对象以在UISegmentedControl中显示,则可以在每个图像上设置此属性,以确保可以正确访问这些段."

所以,我想知道你是否可以在每个NSString对象上设置accessibilityLabel,并且能够使用它来访问每个具有KIF的段.首先,您可以尝试创建几个字符串,设置其可访问性标签,并使用[[UISegmentedControl alloc] initWithItems:myStringArray]; 填充它.

请向我们介绍您的进度.我想知道这是怎么回事


小智 9

每个段UISegmentedControl都是UISegment类实例的子类UIImageView.您可以按subviews属性访问这些实例,UISegmentedControl并尝试以编程方式为它们添加辅助功能.


小智 8

这是一个古老的问题,但是为了防止其他任何人遇到这种情况,我发现这些网段会自动将可访问性标签指定为其文本.因此,如果添加了选项1和选项2的两个选项

[tester tapViewWithAccessibilityLabel:@"Option 2"];
Run Code Online (Sandbox Code Playgroud)

成功选择了该细分.


小智 6

使用索引子视图的解决方案不起作用,因为您不能依赖正确的顺序,并且很难更改段数。并且按原点排序不起作用,因为框架(至少对于当前版本)似乎总是在 x: 0。

我的解决方案:

(segmentedControl.accessibilityElement(at: 0) as? UIView)?.accessibilityLabel = "Custom VoiceOver Label 1"
(segmentedControl.accessibilityElement(at: 1) as? UIView)?.accessibilityLabel = "Custom VoiceOver Label 2"
(segmentedControl.accessibilityElement(at: 2) as? UIView)?.accessibilityLabel = "Custom VoiceOver Label 3"
Run Code Online (Sandbox Code Playgroud)

似乎对我有用并且顺序正确。您也不依赖图像。也不是那么漂亮,但可能比其他解决方案更可靠。


Ilk*_*aci 5

您不能依靠subviewsarray中的索引来获取位置。为了自定义单个子视图,我在设置任何属性之前将子视图在其X位置上进行排序。对于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"
Run Code Online (Sandbox Code Playgroud)