Подтвердить что ты не робот

Как повторно использовать/перерабатывать пользовательский элемент, например, uitableviewcell?

При использовании UITableView мы можем повторно использовать его ячейки с помощью методов [[ UITableViewCell alloc] initWithStyle: reuseIdentifier:] и [uiTableViewInstance dequeueReusableCellWithIdentifier:]. Это помогает держать память под контролем для огромных таблиц, поскольку в данный момент в представлении есть только несколько ячеек.

Я хочу создать UIScrollView, который имеет много подпрограмм. Вставка всех подъявок занимает много памяти и начальное время, которое я хочу избежать. Поддерживает ли Apple API способы повторного использования таких пользовательских компонентов (UIView или подкласс этого объекта здесь), так же как представления ячеек с использованием идентификатора?

Я создам один, если API отсутствует, но есть некоторые сомнения относительно этого. Например, для каждого нового subview, я устанавливаю его положение кадра, после представлений previos. Как я должен обновлять фрейм для каждого объекта в процессе переработки? Должен ли я удалять и перезагружать содержимое каждого подзаголовка по мере его рециркуляции? Должен ли я делать все эти вычисления в другом потоке, чтобы избежать отрывистой прокрутки? В целом, я хотел бы иметь гладкий опыт прокрутки, например, в UITableView со всеми повторными материалами.

Вот пример кода, который я написал до сих пор:

int numberOfPages = 0;
int pageWidth = 100;
int pageHeight = 100

UIScrollView *myScrollView = //allocate and initialize a scrollview
//set its size to 100 by 100 (width equal to pageWidth)
//set paging enabled for myScrollView

Добавление подпрограмм к нему из метода, который называется несколько раз

- (void) appendSubViewToScrollView {
    UIView *view = //allocate and initialize a view and dump data in it.

    CGRect rect = view.frame;
    rect.size.height = pageHeight;
    rect.size.width = pageWidth;
    rect.origin = CGPointMake(pageHeight * numberOfPages, 0);
    view.frame = rect;

    [myScrollView addSubview:view];

    numberOfPages++;

    [scrollView setContentSize:CGSizeMake(pageHeight * numberOfPages, pageWidth)];

    [view release];
}

Edit:
Некоторое понимание того, как tableview и его ячейки достигают этого за кулисами, было бы полезно.

4b9b3361

Ответ 1

Да, вы должны каждый раз восстанавливать каждый контент subview, точно так же, как в представлении таблицы. Преимущество переобучения в области просмотра - это сохранение памяти для хранения в виде хранилища и экономия времени для размещения в представлении, но, конечно же, управление данными контента зависит от вас.

Таким образом, для стандартного подхода к переработке требуется использовать несколько ячеек, равное количеству просмотров, видимых одновременно на экране + количество дополнительных ячеек, которые вы можете получить при запуске прокрутки. Скажем, например, вы показываете по 5 полных просмотров за раз (прокрутка выглядит стабильной), а затем при прокрутке вам потребуется один дополнительный вид, который частично отображается, поэтому в конце вам нужно 5 + 1 = 6 просмотров. Это теоретически, рекомендуется использовать еще 2 вида. Таким образом, вам нужно написать два пула: один из них называется "visibleViews", который сделан из всех представлений, добавленных как subviews в scrollview, а другой - "AvailableViews", который сделан из всех представлений, доступных для повторного использования. Затем вы создаете все эти виды и добавляете их в вид прокрутки (да: вам нужно настроить их кадр в соответствии с их положением в scrollview, и да, вам нужно снова настроить контент). Наконец, вам нужно отследить движение прокрутки, установив делегат. Цель этого отслеживания - рассчитать, какое из видимых видов больше не видно, затем удалить его из видимого пула и перейти в полезный пул. Кроме того, делегат должен понять, когда появится новая ячейка, но она все еще не видна, а затем получает ее из доступного пула (или выделяет/инициализирует ее, если пул пуст) и добавляет как видимый пул, так и подзаголовок scrollview. Конечно, если вы хотите повысить производительность, вы можете разместить больше подвид в представлении прокрутки, чтобы избежать перемещения ячеек точно, когда они начинают появляться на экране, поэтому я рекомендовал использовать несколько дополнительных представлений по сторонам прокрутки.

Есть отличное видео с WWDC 2010 (вы можете получить к нему доступ, если вы являетесь зарегистрированным разработчиком) об использовании прокрутки в iOS: он объясняет эту технику.

Пример кода Apple PhotoScroller в документации XCode существенно отличается от того, что указано в видео WWDC и объясняет эту технику.