2009-07-27 8 views
3

J'ai un UITextView avec du texte, et je veux être capable de le faire défiler de telle sorte qu'un NSRange donné du texte est en haut de la vue. L'utilisation de scrollRangeToVisible: ne fonctionne pas: elle fait défiler la plage de sorte qu'elle se trouve quelque part dans la vue, pas nécessairement là où je veux qu'elle soit. Comment puis-je faire défiler de sorte que ce NSRange de texte dans le UITextView est exactement au sommet?Défilement de la plage dans UITextView

Merci pour vos suggestions.

Répondre

3

La seule réponse qui vient à l'esprit est de travailler vous-même sur contentOffset. Utilisez NSString -sizeWithFont:forWidth:lineBreakMode: sizeWithFont:constrainedToSize:lineBreakMode: pour calculer la taille de la boîte immédiatement au-dessus du texte que vous voulez (cela peut être difficile si le texte n'a pas à démarrer la ligne, vous devrez peut-être essayer plusieurs plages pour trouver celle qui cause la hauteur pour sauter). Cela devrait vous donner le contentOffset dont vous avez besoin pour UIScrollView -setContentOffset:animated:. Je suis un peu inquiet au sujet de la performance, et il peut s'avérer nécessaire de créer votre propre implémentation de UITextView pour être efficace (ce qui ne devrait pas être si difficile si c'est un contenu statique).

Ce n'est pas une solution aussi élégante que je le souhaite, mais UITextView ne vous donne pas beaucoup d'accès au moteur de mise en page.

+0

Merci beaucoup pour votre réponse. Je vais aller de l'avant et essayer cela. Il est vraiment stupide qu'Apple n'ait pas rendu UITextView plus fonctionnel pour des situations de grande envergure. –

+0

Si vous le comparez à NSTextView, vous pouvez voir qu'Apple a radicalement simplifié le moteur de mise en page. Quand ils font ce genre de changement, ils gardent souvent une grande partie de la fonctionnalité privée pour quelques versions pendant qu'ils travaillent sur les détails. Une fois qu'ils rendent une interface publique, ils doivent la supporter au moins par un cycle de dépréciation, et s'ils ne sont pas vraiment satisfaits de l'interface, alors ils veulent pouvoir la changer sans avoir à gérer cela. Cela nous donne moins au début, mais cela signifie que Cocoa a tendance à moins tourner que, par exemple, .NET, où les interfaces changent radicalement. –

+0

Rob, je ne comprends pas vraiment ta réponse. Jonathan, est-ce que ça t'a aidé? Je comprends comment utiliser les UIKitAdditions pour calculer le cadre occupé par le texte intégral, mais comment obtenir l'emplacement des coordonnées d'une gamme donnée de texte dans ce cadre? Quelle est l'étape manquante ici? –

Questions connexes