UIAccessibility - голос, не работающий для NSMutableAttributedString

У меня есть текст «Пользователь может вносить изменения« здесь »». буква «здесь» кликабельна, и при нажатии на нее. [Проверить изображение] [1]

По умолчанию закадровый голос не фокусируется на нем и не зачитывает его.

Как мне сделать так, чтобы он фокусировался с помощью голоса, сделать его кликабельным и произнести название.

Создал расширение для UI Label и Am, вычисляющее кадр attributedText из NSRange.

        let attribute : [String : Any] = [NSForegroundColorAttributeName: Theme.getColor(forCode: "LinkBlue")]
        let strToUse = contentForKey("String")
        range =  (footerText as NSString).range(of: strToUse)
        let attributedString = NSMutableAttributedString(string: footerText)
        if let textRange = range{
             attributedString.addAttributes(attribute, range:textRange)
        }
        footerVw.headerTitleLabel.attributedText = attributedString
        footerVw.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(MyProfileViewController.showPage))
        footerVw.headerTitleLabel.addGestureRecognizer(tap)

Заранее спасибо.

[1]: https://i.stack.imgur.com/uLQZF.png


person Mahesh    schedule 30.05.2017    source источник
comment
Этого фрагмента кода недостаточно, отсутствует много контекстной информации. Что такое footerVw? VoiceOver когда-либо фокусировался на каком-либо из этих представлений? И т.п.   -  person ChrisCM    schedule 31.05.2017
comment
Да, он фокусируется. Его упор на весь лейбл (в том числе и здесь). я хочу, чтобы он был сосредоточен отдельно и читал   -  person Mahesh    schedule 01.06.2017
comment
Вы должны создать два отдельных UILabel (или, возможно, UILabel и UIButton), и стилизовать их одинаково и выровнять их вместе.   -  person ChrisCM    schedule 01.06.2017
comment
С точки зрения доступности, вероятно, предпочтительнее иметь возможность действовать целиком.   -  person ChrisCM    schedule 01.06.2017
comment
сделал это, но это нарушает дизайн Ux   -  person Mahesh    schedule 01.06.2017
comment
UX-дизайн? Только пользователи с ограниченными возможностями узнают, что значит фокусировка VoiceOver. И выделение элемента, который просто говорит здесь, очень бесполезно.   -  person ChrisCM    schedule 01.06.2017


Ответы (2)


Вещи, которые делают вид независимо фокусируемым с помощью VoiceOver:

  • theView.isAccessibilityElement = true
  • allHeirarchicalParentViews.isAccessibilityElement = false

OR

  • hierarchicalParent.isAccessibilityElement = false
  • hierarchicalParent реализует протокол UIAccessibilityContainer.

Если бы вы подробно описали, как реализовано это представление, в частности, каково точное разделение между «Теперь пользователь может вносить изменения» и «здесь», мы могли бы дать более точный ответ. EX: С какими типами представлений вы имеете дело, с каким видом макета, являются ли представления, которые содержат эти разные фрагменты текста отдельно, или это просто строка, которая приписывается, какой элемент является активным и как ... так далее?

Предположим, мы просто хотим, чтобы весь UILabel представлял фокусируемую область, и все это активно (сценарий 1). С этим решением будет простая проблема. Когда VoiceOver активирует элементы доступности, точка активации - это середина выделенного прямоугольника. Итак, предположим, что ваш UILabel имеет какой-то тип прослушивателя щелчков, и весь фрагмент текста охвачен фокусом VoiceOver. Вы хотите, чтобы accessibilityActivationPoint находился там, где находится текст «здесь».

yourUILabel.accessibilityActivationPoint = calculatePointOf(text:'Here')
person ChrisCM    schedule 31.05.2017
comment
Создал расширение для UI Label и Am, вычисляющее кадр attributedText из NSRange. - person Mahesh; 31.05.2017
comment
Вы должны разделить их на два разных объекта. Один информативный и один активный. Или просто оставьте активным весь UILabel. Так или иначе. Но ответ на это - ответ на другой вопрос. - person ChrisCM; 31.05.2017

По умолчанию закадровый голос не фокусируется на нем и не зачитывает его.

Хороший способ достичь своей цели - заключить изменяемую строку в UITextView, делегат которого позволит открывать столько ссылок, сколько нужно: вы не достигнете своей цели с помощью одного UILabel < / сильный>.

Предполагая, что вы работаете с UITableViewHeaderFooterView, попробуйте добавить эту оболочку, например, в нижний колонтитул contentView.

Как мне сделать так, чтобы он фокусировался с помощью голоса, сделать его кликабельным и произнести название.

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

person XLE_22    schedule 19.06.2019