3

私は現在、次のコードを使用してグリフの論理 NSView 位置を取得していますが、少し遅いようで、位置が文字のカーニング ポイントとベースラインに正確にありません。私がしなければならないことは、グリフ自体を 1 つずつ反復し、rect を自分で構築することだけである場合が非常によくあります。

このコード (関数) は、より効率的または適切に実行できるかどうかを確認したいだけです。

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

1 に答える 1

3

これがその方法です。ただし、 lastRange が説明したように characterRange である場合は、それを通過させる必要があります

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

最初に正しい結果を取得します。また、テキストがレイアウトされているテキストコンテナの起源を考慮してから、

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

描く前に。

于 2009-05-17T16:27:17.910 に答える