2010-11-19 14 views
0

Comme un exercice avec l'accessibilité et un défi personnel à moi-même, j'ai décidé que je voudrais écrire une application relativement simple.Touches de tirBegan sur un MKMapView avec VoiceOver activé

L'application affichera un MKMapView des États-Unis et lorsque vous appuyez n'importe où dessus, elle utilise un MKReverseGeocoder pour vous montrer la localité, l'état et le pays où vous avez engagé. Cela fonctionne bien, même si je dois détourner les événements tactiles en ajoutant un WildcardGestureRecognizer au MKMapView. Cela fonctionne très bien avec VoiceOver éteint.

Lorsque j'appuie sur VoiceOver et que j'appuie sur la carte, cela indique "carte". Si je tape deux fois, cela fait un peu de bruit clicky qui indique que vous l'avez activé. Pour être honnête, je ne sais pas comment intercepter ces événements. Je sais que la solution générale est de mettre une vue transparente au-dessus de tout l'écran et de faire des passes, mais cela fonctionnera-t-il avec VoiceOver?

Pour mémoire, le WildcardGestureRecognizer j'utilise se trouve ici: How to intercept touches events on a MKMapView or UIWebView objects?

Répondre

2

Le problème est que lorsque vous allumez VoiceOver, les événements tactiles sont bloqués par le système. Pour le prouver, mettez une trace dans votre fonction touchesBegan. Il devrait bien se déclencher jusqu'à ce que vous allumiez VoiceOver.

Le petit bruit de claquement que vous entendez lorsque vous appuyez deux fois est le geste VoiceOver Over-ride. VoiceOver a son propre ensemble de gestes, mais vous pouvez surpasser les gestes de VoiceOver avec une double prise. Par exemple, glisser vers le bas ne fait pas défiler une page avec VoiceOver activé. Mais si vous appuyez deux fois sur le bouton, attendez le son clicky, puis balayez vers le bas, il défilera.

2

iOS 5.0 a ajouté cette capacité - il suffit de mettre le trait UIAccessibilityTraitAllowsDirectInteraction sur la vue:

mapView.accessibilityTraits |= UIAccessibilityTraitAllowsDirectInteraction; 

(si cela ne fonctionne pas, vous pourriez plutôt besoin de sous-classe la vue carte et passer outre la méthode accessibilityTraits)

Le premier contact sur cet élément fera toujours le "clic" et annoncera le nom de la vue etc., mais toutes les touches suivantes seront des interactions directes - c.-à-d. Que les événements tactiles seront transmis à la carte. Exemple d'utilisation dans l'une des applications iOS d'Apple: GarageBand - la vue de piano a cet attribut défini de sorte que l'aveugle peut jouer les touches du clavier de piano en les touchant directement.