Мы используем KIF для нашего функционального тестирования, и он использует метку доступности элементов, чтобы определить, куда отправлять события. В настоящее время я пытаюсь протестировать поведение UISegmentedControl, но для этого мне нужно установить разные метки доступности для разных сегментов элемента управления. Как установить метку доступности для определенного сегмента?
Как установить метку доступности для определенного сегмента 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 или даже сторонних фреймворках.
Примечание. Жесты теперь будут разными. Нажмите, чтобы просмотреть информацию о доступности, дважды нажмите, чтобы выбрать. Сведение к минимуму окна инспектора специальных возможностей (нажатие кнопки 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."
}