iOS Обновить ярлык доступности

У меня есть кнопка с ярлыком доступности @"a", Когда кнопка нажата, у меня есть обратный вызов, который устанавливает метку доступности button.accessibilityLabel = @"b", Я знаю, что эта строка кода работает. Однако, если я снова нажму кнопку, VoiceOver все равно будет читать a. К сожалению, код, с которым я работаю, проприетарный, поэтому я не могу поделиться им напрямую.

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

3 ответа

НАИЛУЧШИЙ способ обработки меток динамической доступности - это переопределить функции свойств в сфокусированных представлениях (например, на UIButton). Это позволяет две вещи. A: гораздо проще поддерживать, чем устанавливать свойство везде, где оно может быть изменено. B: вы можете регистрировать информацию и видеть, когда система запрашивает эту информацию, чтобы вы могли лучше понять ПОЧЕМУ что-то происходит. Таким образом, даже если это напрямую не решает вашу проблему, присматривать КОГДА система запрашивает ваше значение и регистрировать эти данные, по сути, ценно.

Делать это в Задаче C

@implementation YourUIButton

-(NSString*)accessibilityLabel {
    if(someCondition) {
        return @"a";
    } else {
        return @"b";
    }
}

@end

В Свифте

public class YourUIButton : UIButton
    override public var accessibilityLabel: String? {
        get {
            if (someCondition) {
                return "a"
            } else {
                return "b"
            }
        }

        set {
            NSException.raise(NSException("AccessibilityLabelException", "You should not set this accessibility label.", blah))
        }
    }
}

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

Здесь много потенциальных проблем. Условия гонки, для которых представление действительно становится предметом фокуса, происходят ли какие-либо родительские и дочерние отношения и т. Д. Переопределение свойства и добавление операторов регистрации в приведенный выше код поможет вам понять, какое представление фактически запрашивает метку доступности и когда. Супер ценная информация!

Используйте это при изменении текста кнопки

UIAccessibility.post(notification: .layoutChanged, argument: yourButton)

Попробуй добавить UIAccessibilityTraitUpdatesFrequently в ваше свойство кнопок accessibilityTraits

- (void)viewDidLoad {
    myButton.accessibilityTraits |= UIAccessibilityTraitUpdatesFrequently
}

Также при смене accessibilityLabel будь уверен, что ты в главной теме.

dispatch_async(dispatch_get_main_queue(), ^{
    myButton.accessibilityLabel = @"b";
});

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

class ViewController: UIViewController {

    var tapCount = 0

    var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        button = UIButton(type: .system)
        button.setTitle("Hello", for: .normal)
        button.frame = CGRect(x: 10, y: 10, width: 100, height: 50)
        view.addSubview(button)

        button.accessibilityLabel = "Hello Button"
        button.accessibilityHint = "Tap here to start the action"
        button.accessibilityIdentifier = "hello_button"
        button.addTarget(self, action: #selector(buttonTap(sender:)), for: .touchUpInside)
    }

    @IBAction func buttonTap(sender:UIButton) {
        tapCount = tapCount + 1
        sender.accessibilityLabel = "Hello button, tapped \(tapCount) times"
    }
}

Что Голос пропускает:

Кнопка Hello-pause-Кнопка-pause-Нажмите здесь, чтобы начать действие

На кнопке нажмите

Привет, нажал один раз

Еще один кран

Привет, нажал два раза

Другие вопросы по тегам