UIViewController в UICollectionView
У меня полноэкранный режим UICollectionView
в моем приложении. Он прокручивается горизонтально, и каждая ячейка заполняет границы представления коллекции. Представление коллекции управляется UIViewController
,
Учитывая, что каждая "страница" достаточно сложна, имеет смысл для каждой страницы управлять UIViewController
, iOS 5 имеет поддержку сдерживания контроллера представления, так что дочерние контроллеры должны получить соответствующие методы жизненного цикла (например, viewWillAppear:
и т. д.) когда представления прикреплены и отсоединены. Насколько хорошо это сыграет с переработкой вида?
При переходе от страницы "1" к "2" будет создан новый вид (поскольку оба могут быть одновременно на экране во время касания). Переходя от страницы "2" к "3", UICollectionView
может успешно удалить из просмотра представление для страницы "1", но что теперь происходит? Буду ли я принудительно вставлять вид в контроллер вида три, как это?
id cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ident" forIndexPath:indexPath];
UIViewController *child_controller = [self controllerAtIndexPath:indexPath];
[child_controller setView:cell];
// ... and so on
Это неправильно. Тем не менее, я не могу придумать правильный способ повторного использования представлений в этом случае. Я принимаю неправильный подход полностью?
3 ответа
Я не думаю что UICollectionView
это лучший выбор для вашей задачи.
Как сказал rob mayoff: вы можете использовать UIPageViewController
,
Другим вариантом может быть использование UIScrollView
с 3 подпредставлениями (предыдущий, текущий, следующий). И вы сможете легко управлять его положением и смещением вида прокрутки для достижения желаемого эффекта.
Это описано в WWDC 2011 "Расширенные методики прокрутки". Вы можете получить исходный код оттуда.
Вероятно, лучше использовать подклассы UIView (или подклассы UICollectionViewCell) вместо инкапсулированных UIViewControllers. Инкапсулированные контроллеры UIViewControllers должны знать свои родительские контроллеры представления, что может вызвать проблемы с поддержкой кода.
Сложность не означает автоматически, что вы должны взглянуть на принятие UIViewController. UIViews также может быть довольно сложным. Роль UIViewController в действительности заключается в том, чтобы обеспечить дополнительную инкапсуляцию и жизненный цикл, который не выглядит так, как вам нужно здесь.
Как уже говорили другие, UIPageViewController кажется хорошей альтернативой, но я не знаю специфики вашей ситуации.
Я сделал то же самое, но с двумя контроллерами представления, видимыми одновременно и переупорядочиваемыми, поэтому представление коллекции было правильным выбором.
Оказалось, что удаление предыдущего представления контроллера представления и добавление нового вызвало значительное снижение производительности при прокрутке, при этом удаление представления было самым медленным методом.
Повторное использование ячеек имеет смысл только в том случае, если новое использование ячейки схоже, но отличается - например, вы меняете текст метки или помещаете другое изображение в вид изображения. Если вы извлекаете и заменяете всю иерархию представлений, вы на самом деле не используете ячейку повторно.
В итоге я использовал новые ячейки для каждого контроллера представления, который мог содержаться. В моем случае было ограничение на количество ячеек, что означало, что на самом деле не было проблемы с потреблением памяти при одновременном использовании большого количества контроллеров представления.
Итак, в двух словах - не используйте клетки повторно. Это дороже, чем хранить старые. Прокрутка таблицы из ста строк отличается от прокрутки по нескольким полноэкранным режимам. Но, учитывая тот факт, что у вас полноэкранный режим, лучше использовать прокрутку.