VoiceOver sur iOS: chaque contrôle se comporte différemment

Bonjour, Habr! Récemment, j'ai parlé d'adapter les applications pour les personnes aveugles et immobiles. Et je ne l'ai pas terminé!

Aujourd'hui, je vais vous dire comment changer le comportement des commandes avec l'aide accessibilityTraitset rendre la vie des aveugles un peu plus pratique. Connaître le travail de ces traits est important pour ne pas écrire vos béquilles.



L'adaptation de l'application iOS est un gros sujet, tout ne rentre pas dans un seul article, donc je les publie en série.

  1. Voice Control et VoiceOver: comment adapter l'application pour les aveugles ou les alambics .
  2. VoiceOver sur iOS: chaque contrôle se comporte différemment.
  3. VoiceOver sur iOS: résolution des problèmes courants.
  4. La différence entre l'implémentation de VoiceOver, le contrôle vocal et les tests d'interface utilisateur. (En cours)

Dans la première partie, nous avons commencé à traiter l'adaptation des applications pour les aveugles à l'aide de VoiceOver: contrôles signés, regroupés, navigation fixe. Dans cet article, nous irons plus loin et considérerons les «fonctionnalités» qui peuvent être données aux contrôles afin d'améliorer leur travail pour les aveugles et d'améliorer généralement la convivialité de l'application.

Fonctions de contrôle - Collection de traits


VoiceOver dispose d'un ensemble standard de «fonctionnalités» UITraitCollectionque vous pouvez appliquer aux commandes. Il est important de les connaître à l'avance afin de ne pas proposer vos propres solutions. Je les ai divisés en trois types:

  1. Type de contrôle.
  2. L'état de contrôle.
  3. Propriétés spéciales des contrôles.

Je vais immédiatement montrer sur un exemple d'écran avec une carte à pizza:



Type de contrôle


VoiceOver connaît quelques types d'éléments de base. Certains d'entre eux sont déjà configurés dans votre projet, mais je vous en parlerai quand même.

Les types de commandes sont utilisées pour la navigation: vous pouvez les parcourir rapidement à l' aide du rotor .

  • .staticText- pour les inscriptions qui ne changent pas. Le texte est facile à lire.
  • .header- rubrique: ajouter à la pizza, rubrique.
  • .button- bouton. La principale façon de signer les contrôles actifs: modifier la composition, bouton.
  • .image - image.
  • .link- lien. Un invité rare dans les applications, fréquent sur les sites.
  • .searchField - Chercher.

Nous regardons un exemple:


  1. Indiquez le titre. .staticTextdéfinir automatiquement pour toutes les étiquettes, mais .headerpour le titre, vous devez le mettre manuellement. Lorsque ce besoin et .headeret .staticText.
  2. Marquez l'endroit sous l'image. La dernière fois que nous avons caché toutes les petites images de VoiceOver, nous n'avons pas perdu de contenu informatif. Cette fois, l'image est grande, ce n'est pas si facile à cacher: l'endroit va devenir vide, c'est étrange. Nous marquons l'image comme nous la .imagesignons .accessibilityLabel = " ".

Bien sûr, les boutons de fermeture et le panier doivent être signés, c'était dans le dernier article.

Statut de contrôle


Le contrôle peut avoir trois états: normal, sélectionné et désactivé. Il est intéressant de noter qu'ils sont prononcés à des moments différents et peuvent être sélectionnés en même temps:



  • .selected- ajoute «sélectionné» devant le nom du champ. Convient à tous les commutateurs et cases à cocher.
  • .notEnabled- ajoute «indisponible». Ce paramètre n'est pas visible dans Interface Builderet n'est contrôlé que par programme.

Un exemple d'ajout de garnitures à la pizza: à l'


aide des états, vous pouvez expliquer à l'utilisateur que la garniture a été ajoutée. Il est pratique de fixer directement à l'intérieur de la cellule. accessibilityTraitsc'est OptionSetpourquoi des méthodes d'insertion .formUnionet de suppression peuvent lui être appliquées .formIntersection:

class ToppingCell: UICollectionViewCell {
    override var isSelected: Bool {
        didSet {
            if isSelected {
                accessibilityTraits.formUnion(.selected)
            } else {
                accessibilityTraits.formIntersection(.selected)
            }
        }
    }
    ...
}

Propriétés spéciales des contrôles


Il y a des propriétés plus inhabituelles. Dans notre cas, ils ne correspondent pas à l'écran de pizza, mais je vais quand même vous en parler, car il y a peu d'informations à leur sujet. Cela vous fera peut-être gagner du temps.

  • .summaryElement — , . , , . , .
  • .updatesFrequently —  . .
  • .causesPageTurn —  . accessibilityScroll(.next) , . .firstResponder.
  • .startsMediaSession —  VoiceOver , . , . , VoiceOver .
  • .playsSound —  , ( , ).
  • .allowsDirectInteraction- pour dessiner et gérer les gestes. Le contrôle traite immédiatement le toucher comme si VoiceOver était désactivé.
  • .keyboardKey- le contrôle commence à réagir comme un bouton du clavier. VoiceOver dispose de plusieurs modes de saisie de texte pour de tels cas:

    - standart typing- comme un simple bouton dans VoiceOver: concentrez-vous d'abord sur la lettre, puis double-cliquez n'importe où pour l'écrire. Vous pouvez taper plus rapidement avec les deux mains: pilotez le clavier avec un doigt (les lettres seront prononcées) et touchez avec l'autre doigt pour confirmer la sélection des touches.
    - touch typing- Numérotation rapide à un bras: faites glisser votre doigt sur le clavier pour accéder aux boutons vocaux. Relâchez votre doigt pour écrire la lettre.
    - direct touch typing- comme un ensemble normal, comme si VoiceOver était désactivé.

Vidéo sur les différentes méthodes de saisie:


Cochez simplement la case IB pour ajouter un comportement. Avec le trait .adjustable, ce ne sera tout simplement pas si facile, à ce sujet séparément.

Configuration du puissant trait .adjustable


Et le dernier trait, particulièrement important, .adjustableest un élément qui peut être régulé: c'est ainsi UIStepperque le travail fonctionne UISlider. Faites glisser cette commande vers le haut ou vers le bas pour modifier la valeur (n'oubliez pas que le balayage vers la gauche / droite fera basculer le focus sur l'élément voisin). Si le contrôle a un UIPanGestureRecognizer, vous pouvez appuyer deux fois et maintenir le deuxième appui, de sorte que le geste fonctionne et vous pouvez le contrôler directement, comme si VoiceOver était désactivé.

Exemples d'application pour .adjustable:

Test switch. La configuration du test se compose de cinq boutons: trois pour choisir la taille de la pizza et deux pour le type de test. Ils doivent être groupés et signés de sorte qu'au lieu de cinq il en reste deux: «Taille, moyenne. Poste d'ajustement " et«Pâte, traditionnelle. Élément d'ajustement. "



Besoin de faire en 4 étapes:

  1. Rendez le conteneur avec des boutons disponible.
  2. Mettez un trait .adjustable.
  3. Mettre en œuvre des méthodes d'augmentation et de diminution.
  4. Renvoie la nouvelle valeur de .accessibilityValue.

override public func awakeFromNib() {
        super.awakeFromNib()
        
        isAccessibilityElement = true // 1
        accessibilityTraits = .adjustable // 2
    }


extension SegmentedControl {
    override public func accessibilityIncrement() { // 3
        controller.selectNext(increment: +1)
    }
    
    override public func accessibilityDecrement() { // 3
        controller.selectNext(increment: -1)
    }
    
    public override var accessibilityValue: String? { // 4
        get {
            return selectedSegment?.accessibilityValue
        } set { }
    }
}

Maintenant, après l'appel du balayage vers le haut accessibilityIncrement(), vous augmenterez le compteur interne et VoiceOver lira la nouvelle valeur du accessibilityValue.

compte du montant total dans le monde. Dans ce bloc, nous voyons quatre contrôles: bouton moins, quantité, bouton plus et prix. Vous pouvez les combiner en un seul viewet les transformer en un seul contrôle: «Quantité, 1, 575 roubles. Élément d'ajustement. " Après un balayage vertical, la quantité changera, puis une nouvelle valeur sera prononcée avec le prix.



Horizontal UICollectionView. Il s'est avéré qu'il est .adjustablepratique d'appliquer pour l'horizontale UICollectionView. Par exemple, choisissez une part dans le menu ou une voiture dans un taxi.



Conclusion


Cette fois, nous avons identifié les traits: leurs types, leurs états et leur comportement. Il s'agit d'un ensemble standard pour les tâches courantes . Pour les contrôles complexes, vous pouvez utiliser .adjustable.

La prochaine fois, examinons une solution aux problèmes courants : ordre de contournement, fenêtres modales, indicateurs de chargement.

Afin de ne pas manquer le prochain article, abonnez-vous à ma chaîne Dodo Pizza Mobile .

Et maintenant, nous avons un poste vacant dans la direction mobile. Je laisse donc ça ici: développeur iOS senior (Nizhny Novgorod).


All Articles