2009-11-22 12 views

Répondre

6

Pour un objet NSTextField, notez qu'il s'agit d'un objet NSTextFieldCell qui effectue le dessin. Vous devrez remplacer -drawInteriorWithFrame: inView: et faire la chaîne vous-même. Le défi sera de trouver les rectangles (plus d'un si la gamme est enveloppée) dans lequel votre sous-chaîne est dessinée. Vous allez devoir utiliser NSLayoutManager et un conteneur NSTextStorage.

Idéal pour utiliser un NSTextView. Les composants NSLayoutManager et NSTextStorage associés sont déjà pré-assemblés et vous obtenez beaucoup d'autres fonctionnalités gratuitement. Plus important encore, il existe une méthode pratique - [NSTextView drawViewBackgroundInRect:] pour que vous n'ayez pas à sous-classer quoi que ce soit. Vous n'avez qu'à demander l'affichage du texte pour son gestionnaire de disposition et son stockage de texte, puis lui demander les rectangles pour la plage donnée. Voir le Text System Overview et les documents liés pour plus de détails.

Pour trouver efficacement les sous-chaînes intéressantes, vous pouvez utiliser custom attributes (ou les fonctions intégrées telles que NSLinkAttributeName) pour vos plages intéressantes.

+0

Si vous essayez d'envelopper votre tête autour du système de texte, vous pourriez faire pire que de commencer avec cette vidéo d'Aaron Hillegass en parler: http://vimeo.com/4793853 –

+0

Un simple exemple de code serait génial ! :) – papr

+0

Ce serait, non? :-) Malheureusement, ce n'est pas quelque chose qui peut être réduit à une longueur compatible StackOverflow. Il y a des exemples qui circulent - essayez cocoadev.com et le moteur de recherche habituel. Astuces pour les mots-clés: NSLayoutManager, glyph range, nstextview drawBackgroundInRect: ... –

0

Une alternative à envisager est un WebView modifiable dans lequel vous pouvez créer les attributs personnalisés avec CSS.

+1

Cela prend soin de la nécessité de trouver les rects de la gamme donnée et du dessin personnalisé, mais cela me semble un peu lourd. Il faut également un peu plus d'efforts pour affecter des attributs (balisage dans ce cas) aux plages souhaitées si vous utilisez des attributs personnalisés. Selon les objectifs du PO, «ce qu'il y a de mieux» pourrait aller dans les deux sens, mais il y a beaucoup d'inconvénients de chaque côté. –

+0

(Sortie de la pièce.) L'attribution d'une plage pour un attribut personnalisé est relativement simple, mais plusieurs types d'attributs personnalisés nécessitent désormais la différenciation des classes d'étendue, etc. C'est une couche supplémentaire. En outre, il faut plus d'efforts (IMO) pour localiser et manipuler ce balisage dans le système de texte par rapport au système Cocoa. –