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-Нажмите здесь, чтобы начать действие
На кнопке нажмите
Привет, нажал один раз
Еще один кран
Привет, нажал два раза