Создание пользовательского UIView, который обрабатывает его собственную прокрутку

У меня есть пользовательски оттянутый UIView (т.е. использует drawView для рендеринга себя). Данные, которые будут отображены, обычно будут больше, чем экран может показать, таким образом, я хочу включать функциональность представления прокрутки в представление, таким образом, клиенты класса не должны иметь дело с ним, и таким образом, пользовательское представление может обработать ленивую загрузку данных, когда это прокручивается.

Но как я разрабатываю представление как это? UITableView проявляет подход наследования от UIScrollView. Я пытался делать то же, но полоса прокрутки больше не имела эффект на то, что было отображено (drawView, не назывался как перемещенная панель). Если у меня есть свое пользовательское представление, включают представление прокрутки, то мне нужны два отдельных класса (внешний класс представления и пользовательски оттянутое представление, которое входит в представление прокрутки), который менее, чем оптимален.

1
задан Bill 6 August 2010 в 23:53
поделиться

2 ответа

В основном есть два способа:

-> Сделать ваше представление подвидом 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 вашего представления) на видеокарте. Однако первый метод будет медленным, если ваше изображение НАМНОГО больше экрана. И есть максимальный размер просмотров. Если ваш контент очень большой, приложение может аварийно завершить работу при первом способе.

1
ответ дан 2 September 2019 в 22:22
поделиться

Вы обязательно должны поместить свое представление в режим прокрутки, не усложняйте ситуацию слишком сильно!

(и если вы это сделаете, попробуйте сначала и приходите сюда с конкретным вопросом, когда вы застряли!)

1
ответ дан 2 September 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: