كيفية حساب الإحداثيات الصحيحة للنص المحدد في NSTextView؟

أحتاج إلى تسليط الضوء على الخط مع علامة الإقحام في NSTextView باستخدام CALayer تراكب وإخراج الشكل المستقيم مع هذا الرمز في my code الخاص بي subclassed ...:

- (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 على ما يرام).

ماذا ينقصني؟

0

1 إجابة

حسنًا ، أعيد كتابة الطريقة بالكامل 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;
}
0
وأضاف