Размер каретки NSTextView иногда игнорируется - PullRequest
1 голос
/ 25 декабря 2011

Я изменяю размер каретки с помощью - (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 ]

2 голосов
/ 25 декабря 2011

Оригинальный ответ:

Если вы еще этого не делаете, создайте подкласс 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];
    }
}

(код, для которого я укралотсюда )

1 голос
/ 17 августа 2013

У меня была такая же проблема.Ответ Донована решает проблему, но когда я пытался нарисовать «прозрачную» карету, мне нужно было сделать больше вещей, и у меня было решение для этого.

Я сделал для этого пост в блоге.http://programming.jugglershu.net/wp/?p=765

Ответ на вопрос «Как нарисовать толстую и прозрачную каретку»: ...

  • Рисование прозрачной каретки в _drawInsertionPointInRect:
  • Очистка каретки вdrawInsertionPointInRect путем вызова метода setNeedsDisplay.

Надеюсь, это поможет тому, кто хочет сделать то же самое.

0 голосов
/ 29 декабря 2011

Кажется, что единственное решение - переопределить недокументированный метод - (void)_drawInsertionPointInRect:(NSRect)aRect color:(NSColor *)color.Я надеялся на лучшее решение.

...