Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Saint AppsConf 2019. Accessibility в iOS. Невид...

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →

Saint AppsConf 2019. Accessibility в iOS. Невидимая сторона вашего приложения

Не каждый разработчик задумывается об относительно узкой аудитории людей с определенными ограничениями. В рамках доклада поговорим о том, что скрывается под термином accessibility и почему она важна не только для людей с особыми потребностями, но и для каждого пользователя. Детальнее остановимся на Voice Over, а также разберем полезные базовые вещи, которыми обладает платформа iOS, но которые почему-то упускаются разработчиками.
На примере приложения Juno расскажу о том, какие шишки мы набивали и как изобретали колесо.

Avatar for Anton Siliuk

Anton Siliuk

October 22, 2019

Other Decks in Programming

Transcript

  1. О чем мы будем говорить • что такое доступность •

    что сделать в первую очередь • Voice Over • тестирование 7
  2. При разработке новых сценариев стоит поставить себя на место пользователей

    Что, если: • вы не видите экран • вторая рука занята/отсутсвует • очень шумная обстановка/вы не слышите 11
  3. Никто не использует DynamicType? • Juno: Заказано поездок с нестандартным

    dynamic type 24% • PSDPDFKit: Около четверти1 пользователей @pdfviewerapp используют нестандартный размер текста • Overcast: 40%2 пользователей Overcast используют нестандартный размер текста 2 Overcast Twi-er 1 PSDPDFKit Twi+er 16
  4. С чего начать? Настройки -> (Основные)? -> Универсальный доступ ->

    Быстрые команды (в самом низу) -> Voice Over Теперь его можно включить: • тройное нажатие на home button (iPhone 8) • тройное нажатие на sleep button (iPhone X) 19
  5. Как обычно работает VoiceOver • сканирует элементы сверху-вниз, слева-направо •

    при фокусировке обводит элемент в рамку • произносит название, значение и другие характеристики • можно водить пальцем по экрану • свайп, чтобы переключаться между элементами 20
  6. Базовые жесты • свайп влево/вправо, чтобы переключиться на предыдущий/следующий элемент

    • свайп вверх/вниз на элементе, если он элемент регулировки или с ним есть связанные действия • сделать жест Z двумя пальцами, чтобы вернуться • двойное нажатие в любом месте, чтобы активировать текущий элемент полный список
  7. Как было у нас • Burger_Menu_Big • не переносит фокус

    на меню при открытии • фокусируется на элементах на заднем плане • Invite_Button, Button 26
  8. Как было у нас • Burger_Menu_Big • не переносит фокус

    на меню при открытии • фокусируется на элементах на заднем плане • Invite_Button, Button • игнорирует фото пользователя 27
  9. Как было у нас • фокус на центральный элемент в

    экране • лишние элементы в иерархии 29
  10. Как было у нас • фокус на центральный элемент в

    экране • лишние элементы в иерархии • непонятный текст для карточки 30
  11. Что сделать в первую очередь • спрятать ненужные элементы •

    сделать видимыми для VoiceOver нужные элементы • использовать понятный текст • правильно группировать элементы • предоставить такие же возможности 34
  12. У всех NSObject Поле Значение isAccessibilityElement "Видит" ли VoiceOver этот

    компонент accessibilityElementsHidden Чтобы временно спрятать компонент 35
  13. UIAccessibility No/fica/on UIAccessibility.post(notification: .screenChanged, argument: nil) UIAccessibility.post(notification: .layoutChanged, argument: nil)

    • если вы используете кастомную навигацию • заставляет VoiceOver просканировать экран заново • вызвать в completion-блоке анимации 36
  14. view.accessibilityViewIsMod al: Bool • Говорит VoiceOver не искать элементы на

    соседних View • Есть некоторые нюансы в более сложных иерархиях doc 38
  15. Что сделать в первую очередь • сделать видимыми для VoiceOver

    нужные элементы • спрятать ненужные элементы • использовать понятный текст • правильно группировать элементы • предоставить такие же возможности 39
  16. У всех NSObject Поле Значение Label Первое, что будет произнесено

    Value Произносится вторым, можно использовать для Switch, Slides e.t.c 42
  17. У всех NSObject Поле Значение Label Первое, что будет произнесено

    Value Произносится вторым, можно использовать для Switch, Slides e.t.c Trait Описывает поведение компонента 43
  18. У всех NSObject Поле Значение Label Первое, что будет произнесено

    Value Произносится вторым, можно использовать для Switch, Slides e.t.c Trait Описывает поведение компонента Hint Произносится последним, после некоторой паузы 44
  19. Новый доступный элемент UIAccessibilityElement open class UIAccessibilityElement: NSObject { /*

    ... */ } // in parent let chartAccessibility = UIAccessibilityElement(accessibilityContainer: self) chartAccessibility.accessibilityFrame = CGRect(x: 0, y: 0, width: 100, height: 100) chartAccessibility.accessibilityLabel = "Cool chart" accessibilityElements = [chartAccessibility] 45
  20. Что сделать в первую очередь • сделать видимыми для VoiceOver

    нужные элементы • спрятать ненужные элементы • использовать понятный текст • правильно группировать элементы • предоставить такие же возможности 46
  21. Группируем элементы final class Container: UIView { init() { isAccessibilityElement

    = true } var accessibilityLabel: String { get { return titleLabel.text } set { fatalError() } } var accessibilityValue: String { get { return valueLabel.text } set { fatalError() } } ... } 47
  22. Меняем порядок элементов // Foundation class NSObject { @available(iOS 8.0)

    var accessibilityElements: [Any] } // App view.isAccessibilityElement = false view.accessibilityElements = [secondLabel, firstLabel] !! Аккуратно, это перетирает остальные дочерние элементы 49
  23. Что сделать в первую очередь • сделать видимыми для VoiceOver

    нужные элементы • спрятать ненужные элементы • использовать понятный текст • правильно группировать элементы • предоставить такие же возможности 51
  24. accessibilityAc+vate() Вызывается у элемента, находящегося в фокусе, двойным тапом в

    режиме VoiceOver final class CreditsView: UIView { override func accessibilityActivate() { // Do main element action switchView.isOn.toggle() } } 52
  25. accessibilityPerformEscape() -> Bool Вызывается по очереди у всех, кто на

    экране, пока кто-то не ответит true, когда пользователь делает Z-жест final class MenuViewController: UIViewController { override func accessibilityPerformEscape() -> Bool { // Call dismiss code here close() return true } } 53
  26. Adjustable trait final class SomeControl: UIView { init() { self.accessibilityTraits

    = .adjustable } override func accessibilityIncrement() { // Called on swipe up } override func accessibilityDecrement() { // Called on swipe down } } 54
  27. Добавить к элементу связанные действия final class PaymentView: UIView {

    init() { accessibilityCustomActions = [ UIAccessibilityCustomAction( name: "Delete", target: self, selector: #selector(deleteCell) ) ] } @objc private func deleteCell() { /*...*/ } } 55
  28. Добавить к элементу связанные действия (Swi;UI) struct PaymentView: View {

    var body: some View { HStack {} .accessibilityAction(named: Text("Delete")) { /*..*/ } } } 56
  29. Что сделать в первую очередь • сделать видимыми для VoiceOver

    нужные элементы • спрятать ненужные элементы • использовать понятный текст • правильно группировать элементы • предоставить такие же возможности 57
  30. Swi$UI + Accessibility = ❤ • облегчает работу с accessibility

    • много делает из коробки • Apple явно делает на это большой упор 59
  31. VoiceOver поможет даже вам // App textField.accessibilityLabel = "Email" //

    XCUITest let nameTextField = app.textFields["Email"] nameTextField.tap() nameTextField.typeText("Hello World") 65
  32. Автоматическое тестирование: XCUITest // App let view = UIView() view.isAccessibilityElement

    = true view.accessibilityTraits = .button view.accessibilityIdentifier = "accessibility-button-send" view.accessibilityLabel = "Send" // XCUITest let button = app.buttons["accessibility-button-send"] XCTAssertEqual(button.label, "Send") 73
  33. Мы обсудили • доступность – это подход • о чем

    подумать в первую очередь • Voice Over • шаги к улучшению • тестирование 75
  34. Видео по теме • UIKonf: Sommer Panage – Accessibility: iOS

    for All • WWDC: Audi?ng Your Apps for Accessibility • WWDC: Visual Design and Accessibility • WWDC: Deliver an Excep?onal Accessibility Experience • WWDC: SwiGUI Accessibility 76