Быстро узнать, как в данный момент сфокусирован объект, с помощью специальных возможностей движка VoiceOver - PullRequest
0 голосов
/ 07 марта 2020

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

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

в моей ячейкеForPowAt indexPath:

в ячейке:

override func accessibilityElementDidBecomeFocused() {
        NotificationCenter.default.post(
            name: NSNotification.Name(rawValue: UIAccessibility.elementFocusedNotification.rawValue),
            object: self.subviews.first(where: {$0.isFocused}),
            userInfo: ["UIAccessibilityElementFocusedKeyElement": "hello there"]
        )
    }

в представлении контроллераDidLoad:

    NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.doSomething(_:)),
        name: NSNotification.Name(rawValue: UIAccessibility.elementFocusedNotification.rawValue),
        object: nil
    )

в том же контроллере

@objc func catchNotification(_ notification: Notification) {
    //print("subscribed, notification: \(notification)")

    if let myNotification1 = notification.userInfo?["UIAccessibilityElementFocusedKeyElement"] {
        print("+++", myNotification1)
    }

   }    

1 Ответ

0 голосов
/ 08 марта 2020

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

Взгляните на несколько собственных приложений Apple. например, приложение настроек. Доступна только вся ячейка. Этикетки нет.

Решение заключается в следующем:

  • на основе ваших ярлыков override accessibilityLabel ячейки, а затем установите isAccessibilityElement на false для ваших ярлыков. Подробнее об этом см. Обеспечение доступности iOS приложения . Прокрутите вниз до пункта «Расширение доступности табличных представлений»
  • , просто вручную установите accessibilityLabel, когда это необходимо, а затем установите isAccessibilityElement на false для своих меток. По-видимому, это решение потребовало бы сброса его, если метка будет обновлена.
  • если вы установите представление или текст для вашего accessoryView, тогда я верю UITableViewCell также примет во внимание его значение. Подробнее об этом см. здесь

Примечание: accessibilityLabel ячейки tableview по умолчанию будет использовать текст своих меток.

...