NSTextView插入符号大小有时会被忽略

时间:2011-12-25 11:15:35

标签: nstextview caret

我正在使用- (void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flag更改插入符号大小。无论如何,当我移动选择时,插入符会暂时变回其默认大小。

是否有另一种方法可以绘制我需要覆盖的插入符号?

我目前正在做什么

- (void)drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)aColor turnedOn:(BOOL)flag {

    aRect.origin.y -= 1;
    aRect.origin.x -= 1;
    aRect.size.width += 1;
    aRect.size.height += 1;

    [super drawInsertionPointInRect:aRect color:aColor turnedOn:flag];

}

3 个答案:

答案 0 :(得分:2)

原始答案:

如果你还没有这样做,请继承NSTextView,然后自己实施drawInsertionPointInRect:color:turnedOn:方法,自己做一个花式插图。

还要注意文档中的这一行:

  

调用此方法时,焦点必须锁定在接收器上。   您不需要直接调用此方法。

子类化是要走的路。

更具体应用答案:

请考虑自己完成所有绘图,而不是调用[super drawInsertionPointInRect...

这样的事情:

- (void)drawInsertionPointInRect:(NSRect)rect color:(NSColor *)color turnedOn:(BOOL)flag
{
    //Block Cursor
    if( flag )
    {
        NSPoint aPoint=NSMakePoint( rect.origin.x,rect.origin.y+rect.size.height/2);
        int glyphIndex = [[self layoutManager] glyphIndexForPoint:aPoint inTextContainer:[self textContainer]];
        NSRect glyphRect = [[self layoutManager] boundingRectForGlyphRange:NSMakeRange(glyphIndex, 1)  inTextContainer:[self textContainer]];

        [color set ];
        rect.size.width =rect.size.height/2;
        if(glyphRect.size.width > 0 && glyphRect.size.width < rect.size.width) 
            rect.size.width=glyphRect.size.width;
        NSRectFillUsingOperation( rect, NSCompositePlusDarker);
    } else {
        [self setNeedsDisplayInRect:[self visibleRect] avoidAdditionalLayout:NO];
    }
}

I stole from here

的代码

答案 1 :(得分:1)

我遇到了同样的问题。 Donovan的答案解决了这个问题,但当我试图绘制“透明”插入符号时,我需要做更多的事情,我有一个解决方案。

我为它做了一篇博客文章。 http://programming.jugglershu.net/wp/?p=765

“如何绘制厚实透明的插入符号”的答案是......

  • 在_drawInsertionPointInRect:
  • 中绘制透明插入符号
  • 通过调用setNeedsDisplay方法清除drawInsertionPointInRect中的插入符号。

我希望这可以帮助那些想要做同样事情的人。

答案 2 :(得分:-1)

似乎唯一的解决方案是覆盖未记录的方法- (void)_drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)color。不过,我希望有更好的解决方案。