Как установить метку доступности для определенного сегмента 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."
}