NSTextView автопрокрутка

Предположим, что есть окно с NSTextView который содержит достаточно текста, чтобы вызвать полосы прокрутки. Когда я изменяю размер окна, текстовое представление автоматически прокручивается так, что строка, которая содержит курсор, появляется в середине текстового представления.

Например, это также можно увидеть в TextEdit в MacOS: вставьте в него кучу текста, прокрутите почти до верха [1], поместите курсор в первую видимую строку и измените размер окна. Теперь представление должно прокручивать свое содержимое так, чтобы курсор попадал в середину представления.

У меня вопрос, как мне отключить это поведение? То есть я хотел бы, чтобы текстовое представление никогда не прокручивало курсор автоматически в середину, когда окно изменено в размере.?

[1] Фактическая позиция прокрутки, в которой происходит указанное поведение, может потребовать некоторого метода проб и ошибок, поскольку я не смог выяснить схему, в которой это происходит. В моем тестировании это произошло, когда полоса прокрутки находится в позиции 10% - 30% от общей высоты (сверху).

1 ответ

Вы можете сделать следующие настройки:-

Создать пользовательский класс NSTextView и реализовать один метод делегата для изменения размера текстового представления и один метод при нажатии на текстовое представление. Обратитесь ниже:-

.h файл

@interface textView : NSTextView
@end

.m файл

#import "textView.h"

@implementation textView

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    // Drawing code here.
}
//Below delegate method which will call when resize the textview. So just set your text view to be non editable.
- (void)viewDidEndLiveResize
{
    [self setEditable:NO];
    [self setSelectable:NO];
}

//Now when you click on the textview below method will called.
-(void)mouseDown:(NSEvent*) theEvent
{
    [super mouseDown:theEvent];
    [self setEditable:YES];
    [self setSelectable:YES];
}

-(void)keyDown:(NSEvent *)theEvent
{
    [super keyDown:theEvent];
    [self setEditable:YES];
    [self setSelectable:YES];
}

@end

Изменить:- Кроме того, упомяните имя пользовательского класса в конструкторе интерфейса внутриtextview -> Custom Class

Другие вопросы по тегам