Как мне найти позицию пикселя символа в NSTextView?
-
22-08-2019 - |
Вопрос
В настоящее время я использую следующий код для получения логической позиции глифов NSView, которая работает нормально, однако кажется немного медленной, и позиции не совпадают с точкой кернинга символов и базовой линией.Вполне возможно, что все, что мне нужно сделать, это перебрать сами глифы один за другим и построить прямоугольник самостоятельно.
Теперь этот код (функции) просто хочу посмотреть, можно ли его сделать более эффективно и правильно.
// 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];
Решение
Вот как это сделать.Однако, если LastRange является символьным диапазоном, как вы описали, вам необходимо пройти через него.
lastRange = [layoutManager glyphRangeForCharacterRange:lastRange actualRange:NULL];
сначала получить правильные результаты.вам также необходимо убедиться, что вы учитываете происхождение текстового контейнера, в котором расположен текст, а затем выполните
NSPoint containerOrigin = [[container textView] textContainerOrigin];
paragraphRect = NSOffsetRect(paragraphRect,containerOrigin.x,containerOrigin.y);
перед рисованием.