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

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

Это кажется неправильным. Однако я не могу придумать правильный способ повторного использования представлений в этом случае. Я принимаю неверный подход полностью?

4b9b3361

Ответ 1

Я не думаю, что UICollectionView лучше всего подходит для вашей задачи.
Как rob mayoff сказал: вы можете использовать UIPageViewController.
Другим вариантом может быть использование UIScrollView с 3 подзаголовками (предыдущий, текущий, следующий). И вы сможете легко управлять своим положением и прокручивать смещение вида, чтобы добиться эффекта, который вы хотите.
Это описано в WWDC 2011 'Advanced Scrollview Techniques'. Вы можете получить исходный код.

Ответ 2

Я сделал то же самое, но с двумя видимыми сразу двумя контроллерами представлений и переупорядочиваемыми, поэтому выбор коллекции был правильным выбором.

Оказалось, что удаление предыдущего представления диспетчера представлений и добавление нового вызвало довольно сильный удар по прокрутке, при этом удаление было самым медленным методом.

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

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

Итак, в двух словах - не используйте повторно ячейки. Это дороже, чем хранение старых. Прокрутка сто таблицы строк отличается от прокрутки нескольких полноэкранных представлений. Но, учитывая тот факт, что ваш полный экран, просмотр прокрутки может быть лучшим вариантом.

Ответ 3

Вероятно, лучше использовать подклассы UIView (или подклассы UICollectionViewCell) вместо инкапсулированных UIViewControllers. Инкапсулированные UIViewControllers должны знать свой родительский контроллер представления, что может вызвать проблемы с ремонтопригодностью кода.

Сложность автоматически не означает, что вы должны взглянуть на принятие UIViewController. UIViews могут быть довольно сложными. Роль UIViewController заключается в том, чтобы обеспечить дополнительную инкапсуляцию и жизненный цикл, который не звучит так, как вам нужно.

Как говорили другие, UIPageViewController тоже кажется хорошей альтернативой, но я не знаю специфики вашей ситуации.