3

NSTextViewオーバーレイを使用してキャレットで行を強調表示CALayerし、サブクラス化されたこのコードで行の四角形を取得する必要がありますNSTextView...:

- (NSRect)overlayRectForRange:(NSRange)aRange
{
    NSScreen *currentScreen = [NSScreen currentScreenForMouseLocation];
    NSRect rect = [self firstRectForCharacterRange:aRange];

    rect = [self convertRectToLayer:rect];
    rect.origin = [currentScreen flipPoint:rect.origin];
    rect = [self.window convertRectToScreen:rect];

    return rect;
}

...そしてオーバーレイを置きます:

- (void)focusOnLine
{
    NSInteger caretLocation = [aTextView selectedRange].location;
    NSRange neededRange;

    (void)[layoutMgr lineFragmentRectForGlyphAtIndex:caretLocation effectiveRange:&neededRange];
    CALayer *aLayer = [CALayer layer];
    [aLayer setFrame:NSRectToCGRect([aTextView overlayRectForRange:neededRange])];
    [aLayer setBackgroundColor:[[NSColor redColor] coreGraphicsColorWithAlfa:0.5]];
    [[aTextView layer] addSublayer:aLayer];
}

その結果、選択オーバーレイは目的の線の幅と一致しますが、Y 軸ではまったく一致しません (X 軸は問題ありません)。

私は何が欠けていますか?

4

1 に答える 1

8

さて、私はメソッドを完全に書き直しました、overlayRectForRange:そして今はすべてうまくいきます。固定コードがあります:

- (NSRect)overlayRectForRange:(NSRange)aRange
{
    NSRange activeRange = [[self layoutManager] glyphRangeForCharacterRange:aRange actualCharacterRange:NULL];
    NSRect neededRect = [[self layoutManager] boundingRectForGlyphRange:activeRange inTextContainer:[self textContainer]];
    NSPoint containerOrigin = [self textContainerOrigin];
    neededRect.origin.x += containerOrigin.x;
    neededRect.origin.y += containerOrigin.y;

    neededRect = [self convertRectToLayer:neededRect];

    return neededRect;
}
于 2012-06-22T11:33:11.610 に答える