Как установить метку доступности для определенного сегмента UISegmentedControl?
Мы используем KIF для нашего функционального тестирования, и он использует метку доступности элементов, чтобы определить, куда отправлять события. В настоящее время я пытаюсь протестировать поведение UISegmentedControl, но для этого мне нужно установить разные метки доступности для разных сегментов элемента управления. Как установить метку доступности для определенного сегмента?
Ответы
Ответ 1
Я только начинаю с KIF, поэтому я не тестировал это, но, возможно, стоит попробовать. Я уверен, что скоро у меня будет такая же проблема, поэтому мне было бы интересно узнать, работает ли она.
Во-первых, Ссылка на протокол UIAccessibility содержит примечание под accessibilityLabel, в котором говорится:
"Если вы предоставите объекты UIImage для отображения в UISegmentedControl, вы можете установить это свойство на каждом изображении, чтобы убедиться, что сегменты правильно доступны."
Итак, мне интересно, можно ли также установить accessibilityLabel для каждого объекта NSString и иметь возможность использовать это для доступа к каждому сегменту с KIF. Вначале вы можете попробовать создать пару строк, установить метки доступности и использовать [[UISegmentedControl alloc] initWithItems: myStringArray]; для его заполнения.
Пожалуйста, сообщите нам о своем прогрессе. Я хотел бы услышать, как это происходит.
Ответ 2
Как сказал Vertex,
Obj-C
[[[self.segmentOutlet subviews] objectAtIndex:3] setAccessibilityLabel:@"GENERAL_SEGMENT"];
скор
self.segmentOutlet.subviews[3].accessibilityLabel = "GENERAL_SEGMENT"
Некоторые советы, чтобы вы не сошли с ума, как я:
- Для прокрутки в режиме доступности проведите пальцем по три пальца.
- Индексы сегментов отстают от ожидаемого, т.е. самый дальний сегмент справа - это 0-й индекс, а самый дальний слева - n-й индекс, где n - количество элементов в UISegmentControl
Ответ 3
Каждый сегмент UISegmentedControl
представляет собой экземпляр класса UISegment
, подкласс которого от UIImageView
. Вы можете получить доступ к этим экземплярам с помощью свойства subviews
UISegmentedControl
и попытаться добавить к ним доступность программно.
Ответ 4
Это старый вопрос, но на всякий случай кто-то сталкивается с этим, я обнаружил, что сегменты автоматически имеют метку доступности, указанную в качестве текста. Поэтому, если два варианта были добавлены Вариант 1 и Вариант 2. Вызов
[tester tapViewWithAccessibilityLabel:@"Option 2"];
успешно выбрал сегмент.
Ответ 5
Это старый вопрос, но на всякий случай кто-то сталкивается с этим, я обнаружил, что сегменты автоматически имеют метку доступности, указанную в качестве текста.
В дополнение к ответу Стюарта, мне показалось очень полезным при написании тестовых примеров включить "Инспектор специальных возможностей" на симуляторе (Настройки → Общие → Доступность → Инспектор доступности). Вы были бы удивлены, сколько элементов уже содержат метки доступности, например, в стандартных элементах пользовательского интерфейса iOS или даже сторонних фреймворках.
![Facebook log in button with accessibility label]()
Примечание. Жесты теперь будут разными. Нажмите, чтобы просмотреть информацию о доступности, дважды нажмите, чтобы выбрать. Сведение к минимуму окна инспектора специальных возможностей (нажатие кнопки X) вернет жесты в нормальное состояние.
Ответ 6
Вы не можете полагаться на индекс в subviewsarray для позиции. Для настройки отдельных подпредставлений я сортирую подпредставления по их X Position, прежде чем устанавливать какие-либо свойства. Что также будет допустимо для 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"
Ответ 7
другой вариант, если он не хочет устанавливать метку пригодности, может вычислять длину каждой части сегмента и использовать
[tester tapScreenAtPoint:segementPosition];
для запуска действий
Ответ 8
Если вы посмотрите на сегментированный элемент управления через инспектор специальных возможностей, то обнаружите, что сегменты являются объектами UISegment. Более того, они оказываются прямыми подпредставлениями UISegmentedControl. Этот факт наводит на мысль о следующем безумно сумасшедшем, но совершенно безопасном коде Swift 4 для установки меток доступности для сегментов 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
}
}
Ответ 9
Ребята, вы хотите посмотреть, как Apple рекомендует это сделать?
Это КУКОЛ.
Это из этого примера:
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)
}
Они применяют метки доступности к изображениям, а затем прикрепляют изображения. Не слишком отличается от приведенного выше ответа.
Ответ 10
Как сказал Вортекс, массив справа налево с [0], начинающимся справа. Вы можете установить каждую опцию доступности, открывая подпредставления. Так как подпредставления являются необязательными, хорошо сначала вытащить подпредставление, а затем назначить требуемые черты доступности. Пример Swift 4 для простого двухсекционного управления сегментами:
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."
}