Можно ли назначить действие доступности для UILabel?

В нашем текущем пользовательском интерфейсе рядом с определенными ярлыками есть кнопка подсказки, которая при нажатии объясняет детали того, на что ссылается ярлык. Таким образом, VoiceOver идентифицирует эти два элемента как отдельные элементы доступности.

Однако, используя доступность, мы надеемся, что сможем сделать все что угодно на самой этикетке. Таким образом, когда метка будет сфокусирована, пользователь будет здесь: "Стоимость учетной записи, 20 долларов США (accessibilityLabel), двойное касание для получения помощи (accessibilityHint)"

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

Если не считать преобразования всех наших ярлыков в кнопки, есть ли способ прослушать метод специальных действий "действие" на наших ярлыках?

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

4 ответа

Решение

Вы пытались добавить UITapGestureRecognizer к Labels?

Что-то вроде:

let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapResponse:")
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.userInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)

func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

В вашем UILabel подкласс, переопределить accessibilityActivate() и реализуйте все, что должно сделать двойное касание:

override func accessibilityActivate() -> Bool {
    // do things...
    return true
}

Если действие может потерпеть неудачу, верните false в тех случаях.

Абсолютно! Вы можете сделать это с помощью UIAccessibilityCustomActions на элементе доступности вместо использования распознавателей жестов касания. Это связано с тем, что доступность работает не так, как у обычных пользователей, и одно касание, когда голос за фокусом попадает куда-то, не даст вам желаемого результата, как в случае обычного использования, и не позволит вам выполнить несколько опций для одного и того же элемента доступности.

На своем недавнем WWDC Apple выпустила отличное видео, объясняющее, как добавить UIAccessibilityCustomActions к любому элементу доступности. Если вы запустите это видео через 33 минуты, вы сможете увидеть, как это реализовано. После этого пользователи Voice Over смогут прокручивать варианты и выбирать тот, который больше всего соответствует его / ее намерениям, тем самым позволяя нескольким действиям быть доступными из одной и той же UILabel.

Group your label and your hint button as one unique accessible element.

Once done, you can use:

According to your environment, I don't recommend to implement a custom action for such a simple use case... the two solutions above should do the job.

Хорошо, это было проще, чем я думал. Чтобы заставить UILabel реагировать на действия доступности, аналогичные действиям кнопки, вы просто реализуете UITapGestureRecognizer. Каркас доступности использует это, как и любой другой UIView.

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:#selector(labelTapped))
    testLabel.userInteractionEnabled = true
    testLabel.addGestureRecognizer(tapGestureRecognizer)

Как только вы это сделаете, ваш ярлык будет реагировать на действия по обеспечению доступности.

Другие вопросы по тегам