【问题标题】:How to calculate correct coordinates for selected text in NSTextView?如何计算 NSTextView 中选定文本的正确坐标?
【发布时间】:2012-06-22 10:06:10
【问题描述】:

我需要使用 CALayer 覆盖在NSTextView 中突出显示带有插入符号的行,并在我的子类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 轴可以)。

我错过了什么?

【问题讨论】:

    标签: cocoa calayer nstextview


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多