Запрет VoiceOver от чтения UIButton как «Возможный текст» - PullRequest
1 голос
/ 24 мая 2019

Я пишу очень простую игру, которая разработана специально для слепых пользователей, но может также использоваться зрячими пользователями. Он использует много кнопок в качестве элементов, однако слепые пользователи взаимодействуют с этими кнопками с помощью пользовательских жестов (панорамирование, касание и т. Д.), Поэтому стандартное взаимодействие закадрового голоса не подходит.

Проблема заключается в том, что на экране вообще нет объектов специальных возможностей, поэтому при загрузке игры голос за кадром начинает читать надписи на кнопках (например, «Возможный текст: назад, меню ...»). Эти кнопки читаются независимо от того, что они не включены. Я также не могу удалить большинство из них для слепых пользователей.

Я попытался отключить доступность элементов, сняв флажок «кнопка» из черт доступности, все позволяет выбирать прямое взаимодействие, я попробовал .accessibilityElementsHidden, все предложения из Как исключить UIButton из VoiceOver? и, кажется, ничего не работает.

Мое текущее решение имеет четкую UILabel без текста, для него задан единственный элемент в массиве .accessibilityElements, а затем для хорошей меры я публикую уведомление об изменении экрана доступности с этой меткой в ​​качестве объекта, чтобы он стал фокусируется, затем я жду секунду в асинхронной очереди отправки после вызова, полностью удаляю метку и возвращаю фокус в основной экран, чтобы пользователь мог взаимодействовать.

Вот пример моего текущего решения:

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.accessibilityElements = [lblVoiceOver!]
    }

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        UIAccessibility.post(notification: .screenChanged, argument: lblVoiceOver)
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.lblVoiceOver.removeFromSuperview()
            UIAccessibility.post(notification: .screenChanged, argument: self.view)
        }
    }

Это, в лучшем случае, глупый взлом, и мне бы хотелось реализовать реальное решение, которое просто предотвращает чтение «Возможного текста» закадровым переводом. Я полагаю, что возможная текстовая функция была добавлена ​​в iOS 11, чтобы помочь приложениям, которые не написаны с учетом доступности, быть более дружественными, но до сих пор я не нашел способа отключить это.

1 Ответ

1 голос
/ 25 мая 2019

Проблема заключается в том, что на экране вообще нет объектов доступности.

Если вы хотите достичь этой цели, просто напишите self.view.accessibilityElementsHidden = true в вашем контроллере представления, который больше не будет содержать доступного элемента для VoiceOver: это будет означать, что содержимое вашего контейнера недоступно .

слепые пользователи взаимодействуют с этими кнопками с помощью пользовательских жестов (панорамирование, касание и т. Д.), Поэтому стандартное голосовое взаимодействие не подходит [...] читать закадровым переводчиком.

... следуя предыдущему обоснованию, вы должны запретить VoiceOver анализировать и читать что-либо в вашем представлении.

Теперь, имея дело только с вашими кнопками, я создал пустой проект с простым кодом для контроллера представления далее (Swift 5.0, iOS 12) :

import UIKit

class NonAccessibleButtonVC: UIViewController {

    @IBOutlet weak var aboveLabel: UILabel!
    @IBOutlet weak var belowLabel: UILabel!
    @IBOutlet weak var myButton: UIButton!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        myButton.accessibilityElementsHidden = true
    }
}

... и вы получите следующий результат на вашем устройстве: enter image description here Кнопка не считается доступным элементом, и если она не работает в вашем коде, это означает, что что-то еще мешает этой правильной операции. Может быть, добавить значение свойства кнопки setAccessibleElement в false в соответствии с вашим контекстом?

Однако другим решением может быть определение отображения нужных объектов специальных возможностей в вашем представлении благодаря его свойству accessibilityElements, убирающему кнопки, например, (см. Пример 2 этой ссылки ) : это определенно будет работать в дополнение к упорядочению всех ваших элементов.

...