Как мне найти позицию пикселя символа в NSTextView?

StackOverflow https://stackoverflow.com/questions/869086

  •  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);

перед рисованием.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top