2017-08-08 5 views
1

J'examine notre application pour le rendre plus accessible, et j'ai un problème avec une vue personnalisée. Note: J'utilise Xamarin/C#, mais cela ne change rien, je l'espère, car il utilise la même API sous le capot.Gérer un "robinet" de VoiceOver sur une vue personnalisée

Cette vue personnalisée reproduit essentiellement le mouvement «glisser vers déverrouiller». Bien sûr, cela ne fonctionne pas avec VoiceOver car, quand il est activé, l'utilisateur ne peut pas "glisser" mais seulement deux fois pour activer une vue/un bouton.

La vue est comme UIView sous-classe, composée des enfants UIVIew s, et un UIPanGestureRecognizer qui attrape le geste de gauche à droite.

j'ai commencé en ajoutant les informations d'accessibilité à la classe parente:

IsAccessibilityElement = true; 
AccessibilityTraits = UIAccessibilityTrait.Button; 
AccessibilityLabel = "..."; 

VoiceOver voit maintenant correctement le curseur comme un point de vue, au lieu de vérifier les sous-vues. Cependant, je ne peux pas l'activer en utilisant le geste "VoiceOver double tap".

J'ai essayé de sous-classer UIControl au lieu de UIView et de surcharger sendAction(), mais cette méthode n'est pas appelée.

Je ne souhaite pas définir le trait UIAccessibilityTraitAllowsDirectInteraction sur le contrôle, car cela rend le rendu de l'application impossible.

Que puis-je faire pour attraper le "double tap" et faire l'action qui est supposée être faite lorsque l'utilisateur glisse le contrôle?

Répondre

1

Alors ... C'était un problème de Xamarin après tout. Pour vous assurer que VoiceOver fonctionne avec les commandes personnalisées, vous devez vous conformer au protocole informel UIAccessibilityAction. Dans mon cas c'était accessibilityActivate().

Mais puisque j'utilise Xamarin, j'ai dû exporter la méthode, pour m'assurer que l'exécution pouvait voir que j'ai implémenté une méthode du protocole informel.

[Export("accessibilityActivate")] 
public bool AccessiblityActivate() { 
    Console.WriteLine("It works!"); 
    return true; 
}