Как установить метку доступности для определенного сегмента UISegmentedControl? - PullRequest
18 голосов
/ 12 января 2012

Мы используем KIF для нашего функционального тестирования, и он использует метку доступности элементов, чтобы определить, куда отправлять события.В настоящее время я пытаюсь проверить поведение UISegmentedControl, но для этого мне нужно установить разные метки доступности для разных сегментов элемента управления.Как установить метку доступности для определенного сегмента?

Ответы [ 10 ]

19 голосов
/ 30 марта 2013

Как сказала Вертекс,

obj-c

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

swift

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

некоторые советы такВы не сходите с ума, как я:

  1. Для прокрутки в режиме доступности проведите тремя пальцами
  2. Индексы сегментов обратны, чем вы ожидаете, то есть самый дальний сегмент кправый - это 0-й индекс, а самый дальний слева - это n-й индекс, где n - это количество элементов в UISegmentControl
10 голосов
/ 13 января 2012

Я только начинаю работать с KIF, поэтому я не проверял это, но, возможно, стоит попробовать.Я уверен, что скоро у меня возникнет та же проблема, поэтому мне было бы интересно узнать, работает ли она.

Во-первых, Справочник по протоколу UIAccessibility имеет примечание в accessibilityLabel, которое говорит:

"Если вы предоставляете объекты UIImage для отображения в UISegmentedControl, вы можете установить это свойство на каждом изображении, чтобы обеспечить правильную доступность сегментов."

ИтакМне интересно, если бы вы могли установить accessibilityLabel для каждого объекта NSString и иметь возможность использовать это для доступа к каждому сегменту с помощью KIF.Для начала вы можете попробовать создать пару строк, установить их метки доступности и использовать [[UISegmentedControl alloc] initWithItems: myStringArray];для заполнения.

Пожалуйста, сообщите нам о вашем прогрессе.Я хотел бы услышать, как это происходит

9 голосов
/ 13 января 2012

Каждый сегмент UISegmentedControl является экземпляром класса UISegment, который подкласс от UIImageView. Вы можете получить доступ к этим экземплярам с помощью свойства subviews, равного UISegmentedControl, и попытаться добавить для них доступ программно.

8 голосов
/ 26 июня 2014

Это старый вопрос, но на случай, если кто-то еще столкнется с этим, я обнаружил, что для сегментов автоматически указана метка доступности, указанная в их тексте.Таким образом, если были добавлены две опции из Варианта 1 и Варианта 2. Вызов

[tester tapViewWithAccessibilityLabel:@"Option 2"];

успешно выбрал сегмент.

4 голосов
/ 20 сентября 2018

Вы не можете полагаться на индекс в 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"
4 голосов
/ 23 сентября 2014

Это старый вопрос, но на тот случай, если кто-то еще столкнется с этим, я обнаружил, что для сегментов автоматически указана метка доступности в качестве их текста.

В дополнение к ответу Стюарта,Я нашел действительно полезным при написании тестовых случаев включить «Инспектор специальных возможностей» на симуляторе («Настройки» -> «Общие» -> «Специальные возможности» -> «Инспектор специальных возможностей»).Вы будете удивлены, как много элементов уже имеют метки специальных возможностей, как в стандартных элементах пользовательского интерфейса iOS или даже в сторонних платформах.

Facebook log in button with accessibility label

Примечание :Жесты теперь будут другими - нажмите, чтобы просмотреть информацию о специальных возможностях, дважды нажмите, чтобы выбрать.Свернув окно инспектора специальных возможностей (нажав кнопку X), вы вернете жесты в нормальное состояние.

1 голос
/ 19 декабря 2018

Ребята, хотите посмотреть, как Apple рекомендует это сделать?

Это FUGLY.

Это из этого примера :

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)
}

Они применяют метки доступности к изображениям, а затем прикрепляют изображения. Не слишком отличается от ответа выше .

1 голос
/ 04 октября 2018

Если вы посмотрите на сегментированный элемент управления через инспектор специальных возможностей, вы обнаружите, что сегменты являются объектами 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
        }
    }
1 голос
/ 23 июля 2014

другой вариант, если вы не хотите устанавливать метку доступности, может вычислять равновесие каждой части сегмента и использовать

[tester tapScreenAtPoint:segementPosition];

для запуска действий

0 голосов
/ 23 августа 2018

Как сказал Вортекс, массив справа налево с [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."
}
...