В основном есть два способа:
-> Сделайте ваш просмотр подпредставлением NSScrollView, это, безусловно, самый простой способ.
-> Подкласс NSScrollView и переключать перерисовку при каждом изменении
Где-то в -init вы делаете:
[self addObserver:self forKeyPath:@"contentOffset" withOptions:0 context:@"redraw"];
Затем переписать этот метод:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == @"redraw") {
[self setNeedsDisplay];
} else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
Это потребует от вашего просмотра обновления его отображения каждый раз. Будет вызван drawRect: все, что вам нужно сделать, это нарисовать эту часть представления.
Если возможно, вам следует придерживаться первого метода, который работает быстрее, поскольку он не каждый раз перерисовывается, а просто перемещает предварительно визуализированную текстуру (CALayer вашего взгляда) на видеокарту. Тем не менее, первый метод будет медленным, если ваш обзор НАМНОГО больше экрана. И есть максимальный размер для просмотров. Если ваш контент очень большой, приложение может аварийно завершить работу с первым методом.