У меня есть пользовательски оттянутый UIView (т.е. использует drawView для рендеринга себя). Данные, которые будут отображены, обычно будут больше, чем экран может показать, таким образом, я хочу включать функциональность представления прокрутки в представление, таким образом, клиенты класса не должны иметь дело с ним, и таким образом, пользовательское представление может обработать ленивую загрузку данных, когда это прокручивается.
Но как я разрабатываю представление как это? UITableView проявляет подход наследования от UIScrollView. Я пытался делать то же, но полоса прокрутки больше не имела эффект на то, что было отображено (drawView, не назывался как перемещенная панель). Если у меня есть свое пользовательское представление, включают представление прокрутки, то мне нужны два отдельных класса (внешний класс представления и пользовательски оттянутое представление, которое входит в представление прокрутки), который менее, чем оптимален.
В основном есть два способа:
-> Сделать ваше представление подвидом 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 вашего представления) на видеокарте. Однако первый метод будет медленным, если ваше изображение НАМНОГО больше экрана. И есть максимальный размер просмотров. Если ваш контент очень большой, приложение может аварийно завершить работу при первом способе.
Вы обязательно должны поместить свое представление в режим прокрутки, не усложняйте ситуацию слишком сильно!
(и если вы это сделаете, попробуйте сначала и приходите сюда с конкретным вопросом, когда вы застряли!)