Come faccio a trovare la posizione di pixel di un personaggio in un NSTextView?
-
22-08-2019 - |
Domanda
Attualmente sto usando il codice seguente per andare a prendere la posizione NSView logica di glifi, che sta lavorando bene ma sembra un po 'lento e le posizioni non sono proprio sul punto di carattere la crenatura e della linea di base. E 'molto ben potrebbe essere il caso che tutto ciò che devo fare è iterare i glifi stessi uno per uno e costruire il me stesso rect.
Questo codice (funzioni) ora, voglio solo vedere se può essere fatto in modo più efficiente e corretto.
// 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];
Soluzione
Questo è il modo per farlo. Tuttavia, se è un lastRange characterRange come hai descritto, bisogna mettere attraverso
lastRange = [layoutManager glyphRangeForCharacterRange:lastRange actualRange:NULL];
prima di ottenere risultati corretti. è anche necessario fare in modo di spiegare l'origine della textcontainer il testo viene layouted in e poi fare un
NSPoint containerOrigin = [[container textView] textContainerOrigin];
paragraphRect = NSOffsetRect(paragraphRect,containerOrigin.x,containerOrigin.y);
prima di disegnare.