swift-ios- Accessibility - сначала измените порядок чтения / фокусировки за кадром на представление контента, затем элементы навигации? - PullRequest
0 голосов
/ 17 ноября 2018

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

Я хочу добиться следующего поведения: Каждый раз, когда загружается текущий вид, фокус VoiceOver будет:

  1. начать с самой верхней метки
  2. посещение всех ярлыков сверху вниз
  3. затем нижняя кнопка
  4. наконец, rightBarButtonItem

Для обеспечения такого порядка я кодировал viewController

navigationController?.view.accessibilityElements = [label1, label2, button, navigationItem.rightBarButtonItem]

Это обеспечило порядок чтения, но порядок фокуса не удался в rightBarButtonItem. На него нельзя нажать.

Как решить эту проблему?

1 Ответ

0 голосов
/ 19 ноября 2018

Каждый раз, когда загружается ваше текущее представление, используйте метод UIAccessibilityPostNotification , чтобы получить свою цель.

Существует несколько типов уведомлений об изменениях, но UIAccessibilityScreenChangedNotification может быть тот, который вас интересует.

Уведомляет об изменении всей страницы, включая nil или UIObject в качестве входящих параметров:

  • При nil фокусируется первый доступный элемент на странице.
  • При UIObject фокусировка смещается на указанный элемент .

Это уведомление сопровождается вокализацией, включая звук, напоминающий объявление новой страницы.


EDIT

Я неправильно понял вашу проблему, которая намного сложнее, чем я думал.

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

Давайте возьмем ваш пример с меткой, кнопкой и панелью навигации, включающей кнопку правой панели (я не принимаю во внимание потенциальную кнопку возврата ).

Следуйте инструкциям ниже в вашем контроллере представления:

ШАГ 1 : создайте свои торговые точки.

@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var myButton: UIButton!
@IBOutlet weak var myRightBarItem: UIBarButtonItem!

ШАГ 2 : скрыть элементы панели навигации, чтобы не слушать их вокализации.

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

    self.navigationController!.navigationBar.accessibilityElementsHidden = true
}

ШАГ 3 : создать доступный элемент для правой панели кнопок.

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

    let rightButtonView = myRightBarItem.value(forKey: "view") as? UIView
    let navigationBarView = rightButtonView?.superview?.superview?.superview

    let newElt = UIAccessibilityElement(accessibilityContainer: self.view)
    newElt.accessibilityFrameInContainerSpace = navigationBarView!.convert((rightButtonView?.superview!.frame)!,
                                                                            to:self.view)
    newElt.accessibilityLabel = "new navigation right bar button"
    newElt.accessibilityTraits = .button

    //Order your elements as you wish.
    self.view.accessibilityElements = [myLabel,
                                       myButton,
                                       newElt]
}

Последний шаг заключается в добавлении одиночного действия или более к правой кнопке панели в соответствии с назначением вашего приложения.

Как только вы это сделаете, вы можете настроить этот подход и порядок чтения / фокусировки для просмотра содержимого, а затем элементы навигации, как указано в вашем вопросе.

Это решение может быть оптимизировано, но оно позволяет достичь вашей цели.

...