Информирование пользователей озвучивания о том, что они выделили элемент в контейнере - PullRequest
1 голос
/ 09 апреля 2019

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

В мини-слое есть ряд элементов доступности: обложка альбома, метаданные трека, кнопки воспроизведения и перемотки вперед. Когда пользователь впервые выбирает элемент в мини-слое, голос за кадром читает «Мини-слой; дважды нажмите, чтобы развернуть мини-слой», прежде чем дать метку для выбранного элемента. Но если вы перемещаетесь между элементами в мини-слое, он просто даст метку, черту и подсказку каждого элемента. Он будет предоставлять метку и подсказку мини-слоя (уровня контейнера) только тогда, когда вы переместились из элемента вне мини-слоя в элемент внутри мини-слоя.

Возможность предоставления такого рода контекста пользователям голосовой связи кажется хорошим дизайном UX, но как это реализовано? Я понимаю, как группировать элементы, включая их в массив myItem.accessibilityElements, но не знаю, как определить, является ли текущий / предыдущий элемент, выбранный пользователем, частью того же контейнера.

1 Ответ

0 голосов
/ 11 апреля 2019

Чтобы проинформировать пользователя VoiceOver о том, что элемент был выбран в контейнере, вы можете создать класс для каждого типа элемента, который у вас есть в контейнере (возможно использование обобщений ???) для переопределения методы неформального протокола UIAccessibilityFocus.

Давайте рассмотрим пример, предполагая, что у нас есть только метки в синем контейнере ниже (код, который будет адаптирован для других видов элементов) : enter image description here

  • Создайте класс для меток, включая свойство для суперпредставления, которому он принадлежит.

    class EltLabel : UILabel {
        var containerView: UIView? {
            get { return self.superview }
            set { }
        }
    }
    
  • Переопределить UIAccessibilityFocus неформальные методы протокола в расширении нового созданного класса.

    extension EltLabel {
    
        override open func accessibilityElementDidBecomeFocused() {
            if self.accessibilityElementIsFocused() {
                // Actions to be done when the element did become focused.
            }
        }
    
        override open func accessibilityElementDidLoseFocus() {
            if self.accessibilityElementIsFocused() {
                // Actions to be done when the element did lose focus.
            }
        }
    
        override open func accessibilityElementIsFocused() -> Bool {
            guard let containerView = self.containerView else { return false }
            return (self.isDescendant(of: containerView)) ? true : false
        }
    }
    
  • Не забудьте создать торговые точки с вашими этикетками, и все автоматически обрабатывается.

    class BoutonViewController: UIViewController {
    
        @IBOutlet weak var label1: EltLabel!
        @IBOutlet weak var label2: EltLabel!
    }
    

Этот фрагмент кода, который будет адаптирован и включен в вашу кодовую среду, проинформирует пользователей VoiceOver о том, что они выделили элемент в контейнере по желанию.

Теперь, если вы хотите "определить, является ли текущий / предыдущий элемент, выбранный пользователем, частью того же контейнера" ​​, просто добавьте переменную в контроллере представления, которая будет увеличиваться / уменьшаться каждый раз, когда элемент контейнера фокусируется / не фокусируется (логической переменной должно быть достаточно) .

...