2013-02-22 1 views
4

Je sais réellement comment faire cela, mais la façon dont je le fais me conduit à mes deux vraies questions. Tout d'abord, je change ce cadre dans une sous-classe UIButton comme ceci:Comment créer accessibilityFrame différent des limites de la vue?

- (CGRect)accessibilityFrame { 
    CGRect rect = [self.superview convertRect:self.frame toView:nil]; 
    rect.size.width *= 5; 
    return rect; 
} 

Si je laisse de côté la première ligne de cette méthode, le cadre de l'accessibilité pour ce bouton apparaît dans l'absolu coin supérieur gauche de l'écran , indépendamment de sa position d'origine. Tous les exemples de code que j'ai trouvés pour remplacer le cadre d'accessibilité utilisent une variante de conversion de coordonnées, mais je ne comprends pas du tout pourquoi. Pourquoi cette propriété ne peut-elle pas être traitée dans le même système de coordonnées que les vues, car cela rendrait immensément plus simple la modification du cadre d'accessibilité?

Ma deuxième question concerne la façon dont ce cadre d'accessibilité fonctionne réellement lorsque VoiceOver est activé. Lorsque je modifie le cadre d'accessibilité de cette manière, le rectangle de focus devient plus grand que prévu. Malheureusement, cet effet semble être purement cosmétique. Même si le rectangle de focus est maintenant beaucoup plus grand que le bouton lui-même, je peux toujours appliquer le focus sur le bouton en tapant dans les limites du bouton proprement dit; Si je tape à l'intérieur du rectangle de mise au point mais à l'extérieur du bouton lui-même, rien ne se passe. C'est un gros problème pour moi parce que j'essaie d'étendre la taille "virtuelle" de certains contrôles qui sont si petits qu'ils sont très difficiles à exploiter à moins que vous ne puissiez les voir. Je ne comprends pas du tout le fait de rendre le rectangle de mise au point seulement cosmétiquement plus grand, si les utilisateurs malvoyants ne peuvent pas le voir de toute façon.

Edit: ajoutant ce bit le tour est joué:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    CGPoint newPoint = [self.superview convertPoint:point toView:nil]; 
    return CGRectContainsPoint(self.accessibilityFrame, newPoint); 
} 

J'aimerais toujours savoir pourquoi quelque chose comme cela est encore nécessaire.

Édition 2: Le code ci-dessus ne fonctionne que dans des cas particuliers (à l'intérieur de plusieurs sous-vues imbriquées). Une solution plus générale est:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    CGPoint newPoint = [self convertPoint:point toView:nil]; 
    return CGRectContainsPoint(self.accessibilityFrame, newPoint); 
} 

Répondre

6

Le cadre de l'accessibilité est spécifiée en coordonnées d'écran (see documentation).

La conversion

-[UIView convertRect:toView:] 

convertit les coordonnées en coordonnées vue fenêtre si toView est nul.

à 100% correct, une conversion supplémentaire de fenêtre en coordonnées d'écran en utilisant

-[UIWindow convertPoint:toWindow:] 

(à nouveau, avec un toWindow nil) serait nécessaire. Maintenant, vous savez probablement déjà que vous devez appuyer deux fois sur le curseur VoiceOver pour déclencher l'action du bouton. Par défaut, le double-clic touche le centre du cadre d'accessibilité. Cependant, si le centre de votre cadre d'accessibilité modifié n'est pas sur votre bouton, rien ne se passera. Commodément, la méthode accessibilityActivationPoint vous permet de placer ce centre ailleurs (par exemple directement sur le centre de votre bouton). Encore une fois, n'oubliez pas de convertir en coordonnées d'écran. Une chose à considérer avant de vous lancer dans la création d'énormes cadres d'accessibilité: si vous avez de très petits boutons, ils peuvent être difficiles à atteindre pour les utilisateurs normaux. Envisagez de les agrandir (ou du moins la zone où ils répondent aux touches).Apple recommends au moins 44 x 44 points.

+0

Je sais à propos de accessibilityActivationPoint. Mon problème n'est pas avec ce qui se passe quand vous double-tapez. Mon problème est que je veux un seul clic n'importe où dans les limites du 'accessibilityFrame' développé pour déplacer le curseur VoiceOver sur ce bouton. Mais cela ne semble pas être le cas pour accessibilityFrame, à moins que (j'espère) je manque un paramètre évident ou quelque chose comme ça. Dans mon application, même avec le fichier accessibilityFrame agrandi, le bouton n'obtient toujours le curseur que si je tape dans les limites du bouton lui-même. – MusiGenesis

+1

J'espère vraiment qu'il me manque quelque chose, car si le accessibilityFrame affecte seulement où le curseur est dessiné, et n'affecte pas si le contrôle obtient le focus, alors à quoi bon est-il pour les personnes aveugles? – MusiGenesis

+0

En outre, je n'ai pas conçu cette application. Je modernise l'accessibilité. Les minuscules boutons sont incroyablement difficiles à toucher, mais je ne peux pas les changer sans passer par un long processus bureaucratique. – MusiGenesis

Questions connexes