Сделайте UITextField с VoiceOver для чтения чисел в виде цифр - PullRequest
0 голосов
/ 30 апреля 2020

Наше приложение имеет несколько UITextField, где пользователи вводят alphanumeri c входные коды, такие как "AA149873A".

Мы бы хотели, чтобы голос зачитал их как «AA 1 4 9 8 7 2 A», но вместо этого они читают цифры как число: «Сто сорок девять тысяч восемьсот семьдесят три ».

Есть ли способ настроить UITextField так, чтобы он знал, что его содержимое следует рассматривать не как числа, а как отдельные цифры?

Спасибо.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Мы хотели бы, чтобы голос зачитал их как «AA 1 4 9 8 7 2 A», но вместо этого они читают цифры как число: «Сто сорок девять тысяч восемьсот семьдесят три ".

Самый быстрый способ достичь цели - добавить пробелы между каждым символом в accessibilityValue из UITextField следующим образом: 100

class AccessibilityTextField: UITextField {

    var _str: String?
    override var text: String? {
        get { return _str}
        set {
            _str = newValue!
            accessibilityValue = _str!.map{String($0)}.joined(separator: " ")
        }
    }

    convenience init() { self.init() }

    required init?(coder: NSCoder) { super.init(coder: coder) }
}

Я не реализовал весь материал делегата текстового поля для его проверки ⟹ Я создал пустой проект только с UITextField, добавив "BB0024FG" простой текст и изменил текст в viewDidAppear моего контроллера представления:

myTextField.text = "AA14987A"

В конце VoiceOver записывает каждый символ за другим, не считывая исходный простой текст. 101

Следуя этому обоснованию, вы можете сообщить VoiceOver, что содержимое UITextField должно рассматриваться как отдельные цифры . ?

1 голос
/ 01 мая 2020

Начиная с iOS 13, можно добавить строковый атрибут для прямой озвучки, чтобы записать строки в виде отдельных букв и цифр.

Я не нашел способа направить UITextField добавить этот атрибут к своему контенту. Однако для достижения этого подкласс UITextField может переопределить его accessibilityValue.

Приведенный здесь подкласс добавляет свойство для включения или отключения этого поведения.

final class AccessibilityTextField: UITextField {

    var isAlphanumeric: Bool = false

    override public var accessibilityAttributedValue: NSAttributedString? {
        get {
            guard let text = text, !text.isEmpty else {
                return nil
            }

            return NSAttributedString(string: text, attributes: valueAttributes)
        }

        set {
            // Ignore these values.
            _ = newValue
        }
    }

    private var valueAttributes: [NSAttributedString.Key: Any] {
        guard #available(iOS 13.0, *), isAlphanumeric else {
            return [:]
        }

        return [.accessibilitySpeechSpellOut: true]
    }
}

Альтернативный подход приведенный в другой ответ здесь, который не использует функцию iOS 13 . accessibilitySpeechSpellOut. Тем не менее, я видел, что это предположило, что это не идеально для систем вывода Брайля, поскольку они также используют accessibilityLabel. Возможно, это хороший запасной вариант для систем до iOS 13.

...