Как поймать доступность, фокус изменился? - PullRequest
0 голосов
/ 10 июня 2019

Я хочу поймать изменение фокуса доступности.

Я искал и пробовал accessibilityElementDidBecomeFocused, но не сработал после изменения курсора. Я хочу добавить значение к кнопке и после изменения курсора удалить это значение.

Мой код похож на:

override func viewDidLoad() {
    flashButton.accessibilityLabel = "Change the flash status"
    flashButton.accessibilityTraits = [.button]
    flashButton.accessibilityIdentifier = "flashButton"
}

@IBAction func flashButtonTapped(_ sender: Any) {
    var currentFlashStatus = "off"
    guard let device =  AVCaptureDevice.default(AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: AVMediaType.video, position: .back) else { return }
    guard device.hasTorch else { return }
    do {
        try device.lockForConfiguration()
        if device.torchMode == .on {
            device.torchMode = .off
            flashButton.image = UIImage(named: "flashOffIcon")
            currentFlashStatus = "off"
        } else {
            do {
                try device.setTorchModeOn(level: 1.0)
                flashButton.image = UIImage(named: "flashOnIcon")
                currentFlashStatus = "on"
            } catch {
                print(error)
            }
        }
        device.unlockForConfiguration()
    } catch {
        print(error)
    }
    flashButton.accessibilityLabel = "Turned \(currentFlashStatus) the flash"
}

Во-первых, на нем написано «изменить состояние вспышки», и если я дважды коснусь, на нем будет написано «Включено состояние вспышки», что является правильным.

Если я поменяю курсор и вернусь к кнопке вспышки, то должно произойти изменение статуса вспышки еще раз. Но там написано "включен статус вспышки"

Как мне этого добиться?

1 Ответ

1 голос
/ 11 июня 2019

Я искал и пытался accessibilityElementDidBecomeFocused, но не сработал после изменения курсора.

Если вы хотите использовать UIAccessibilityFocus методы неформального протокола, вы ДОЛЖНЫ переопределить их в вашем объекте напрямую, а не в контроллере представления (см. этот ответ ) . Создайте подкласс UIButton, например:

import UIKit

class FlashButton: UIButton {}

extension FlashButton {

    override open func accessibilityElementDidBecomeFocused() {
    // Actions to be done when the element did become focused.
    }
}

Если я поменяю курсор и вернусь к кнопке вспышки, то должно произойти изменение статуса вспышки.

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

Пример приведен в следующем коде:

class FlashButton: UIButton {

    private var intStatus: Bool = false
    private var a11yLabelStatus: String = "off"

    var status: Bool {
        get { return intStatus }
        set(newValue) { intStatus = newValue }
    }
}

extension FlashButton {

    override open func accessibilityElementDidBecomeFocused() {
    // Actions to be done when the element did become focused.
    }

    override open func accessibilityElementDidLoseFocus() {
    // Actions to be done when the element did lose focus.
    }

    //This native a11y function replaces your defined IBAction to change and read out the flash status.
    override func accessibilityActivate() -> Bool {

        intStatus = (intStatus == true) ? false : true
        a11yLabelStatus = (intStatus == true) ? "on" : "off"

        UIAccessibility.post(notification: .announcement,
                             argument: "flash status is " + a11yLabelStatus)
        return true
    }

    override var accessibilityLabel: String? {
        get { return "the flash status is " + a11yLabelStatus }
        set { }
    }

    override var accessibilityHint: String? {
        get { return "double tap to change the value." }
        set { }
    }
}

Как мне этого добиться?

Либо вы пытаетесь использовать неформальный протокол UIAccessibilityFocus, чтобы поймать изменение фокуса, либо просто используете приведенный выше фрагмент кода, чтобы изменить статус вашего элемента доступности : вы можете комбинировать и то, и другое до вам адаптировать эти концепции в вашей среде программирования. ; О)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...