2009-05-15 14 views
3

Ich verwende derzeit den folgenden Code, um die logische NSView-Position von Glyphen zu holen, die gut funktioniert, aber es scheint ein bisschen langsam und die Positionen sind nicht genau auf dem Zeichen Kerning Point und Baseline. Es kann sehr gut der Fall sein, dass alles, was ich tun muss, ist, die Glyphen selbst nacheinander zu durchlaufen und das Rect selbst zu bauen.Wie finde ich die Pixelposition eines Zeichens in einem NSTextView?

Dieser Code (Funktionen) jetzt, nur um zu sehen, ob es effizienter oder richtig durchgeführt werden kann.

// 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]; 

Antwort

3

Dies ist der Weg, es zu tun. Allerdings, wenn lastRange ein characterRange ist, wie Sie beschrieben, müssen Sie es durch

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

erste richtige Ergebnisse zu erhalten. Sie müssen auch der Text für den Ursprung des textcontainer zu berücksichtigen stellen Sie sicher, layoutet und mache dann einen

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

vor dem Zeichnen.

Verwandte Themen