2009-05-15 7 views
3

J'utilise actuellement le code suivant pour récupérer la position NSView logique des glyphes qui fonctionne correctement, mais il semble un peu lent et les positions ne sont pas précisément sur le point de crénage et la ligne de base du caractère. Il se peut très bien que tout ce que je dois faire est de répéter les glyphes eux-mêmes un par un et de construire le rectiligne moi-même.Comment trouver la position en pixels d'un caractère dans un NSTextView?

Ce code (fonctions) maintenant, je veux juste voir si cela peut être fait plus efficacement ou correctement.

// lastRange is any valid, bounds checked character range in an NSTextView 


NSLayoutManager *layoutManager = [self layoutManager]; 
NSRect paragraphRect = [layoutManager boundingRectForGlyphRange:lastRange inTextContainer:[self textContainer]]; 

// Draw a gradient around the range. 
NSGradient * gradient = [self indicatorGradient]; 
CGContextRef myContext = [[NSGraphicsContext currentContext] graphicsPort]; 
CGContextSetBlendMode(myContext , kCGBlendModeMultiply); 
[gradient drawInRect:paragraphRect angle:90]; 

Répondre

3

C'est la manière de le faire. Cependant, si lastRange est un characterRange comme vous l'avez décrit, vous devez le mettre à travers

lastRange = [layoutManager glyphRangeForCharacterRange:lastRange actualRange:NULL]; 

d'abord pour obtenir des résultats corrects. vous devez également vous assurer de rendre compte de l'origine du textcontainer le texte est layouted et puis faire une

NSPoint containerOrigin = [[container textView] textContainerOrigin]; 
paragraphRect = NSOffsetRect(paragraphRect,containerOrigin.x,containerOrigin.y); 

avant de tirer.

Questions connexes