Галлерея с UICollectionViewController

Продолжим более подробное изучение контроллеров представления в iOS. На очереди контроллер коллекции — UICollectionViewController. При его изучении, напишем приложение-галлерею, в котором рассмотрим работу с UICollectionView, а также впервые создадим свой кастомный класс для ячейки.

Откройте Xcode и создайте новый проект:

  • Name: MyGallery;
  • Language: Swift;
  • Devices: iPhone.

Перед тем как продолжить, подготовьте 15-20 изображений, которые впоследствии будут использованы. Так как имя проекта MyGallery, не лишним будет использовать Ваши фотографии либо же просто проявить немного фантазии. Собрав нужное количество фотографий, добавьте их в asset-каталог проекта.

Интерфейс

Откройте Xcode и отключите опцию Use Size Classes. Перетащите UICollectionViewController из Object library таким образом, чтобы он был слева от уже существующего контроллера предсталвения. Оберните его в UINavigationController и последний задайте в качестве первоначального контроллера, выбрав опцию Is Initial View Controller. После добавьте связь между ячейкой контроллера коллекции и UIViewController‘ом:

Галлерея с UICollectionViewController

Добавление связи между UICollectionViewCell и UIViewController

Выделите появившийся segue и задайте ему идентификатор «goPhoto». Контроллер коллекции позволит отображать список фотографий. По нажатию на определенное фото (ячейку),  приложение откроет её в полном размере в контроллере представления. Теперь, когда мы закончили добавление необходимых контроллеров, подготовим UICollectionViewController. Выделите его, откройте вкладку Size Inspector и укажите следующие параметры:

  • Cell Size:
    • Width: 78;
    •  Height: 78;
  • Min spacing:
    • For Cells: 1;
    • Min lines: 1;
  • Section Insets:
    • Left: 1;
    • Right: 1;

Такие параметры позволят отображать 4 ячейки в ряд, с равными промежутками между ними, а также с равным расстоянием от левой и правой границы экрана. Далее зададим идентификатор ячейки, к которому будем обращаться из кода. Выделите её и в разделе Attributes inspector в поле Identifier напишите «Cell».

Убедитесь, что ячейка всё еще выделена и перетащите в неё объект UIImageView, задав следующие параметры: 

  • Attributes inspector:
    • Mode: Aspect Fill.
  • Size inspector:
    • X: 0;
    • Y: 0;
    • Width: 78;
    • Height: 78.

В результате Ваш контроллер коллекции должен выглядеть следующим образом:

Галлерея с UICollectionViewController

UICollectionViewCell с объектом UIImageView

Перейдем к UIViewController и также поместим на него объект UIImageView со следующими параметрами:

  • Attributes inspector:
    • Mode: Aspect Fit.
  • Size inspector:
    • X: 0;
    • Y: 0;
    • Width: 320;
    • Height: 568.

На данном этапе вся подготовительная работа с интерфейсом окончена.

UICollectionViewCell

Я упоминал ранее, что в данном уроке речь пойдет и о создании своего класса ячейки. Так как в интерфейсе мы подготовили кастомную ячейку с UIImageView, создание класса будет не лишним. Добавим новый файл к проекту: New File -> Cocoa Touch Class и зададим следующие значения:

  • Name: MyCell;
  • Subclass of: UICollectionViewCell;
  • Language: Swift.

Вернемся в storyboard и снова выделим нашу ячейку. Откройте Identity inspector и в поле Class укажите название нового класса — «MyCell». Как Вы видите, это тот же самый процесс, который происходит при связывании контроллера со своим классом. Откройте файл MyCell, зажав кнопку Alt, протяните связь между UIImageView и классом, и дайте имя imageView:

Галлерея с UICollectionViewController

Добавление связи между UIImageView и классом UICollectionViewCell

Готово! Казалось бы простые действия, но в будущем они отлично упростят нам работу.

UIViewController

Последнее, что нам нужно сделать до работы с UICollectionViewController — подготовить UIViewController.

Добавьте в проект класс под названием «PreviewVC» (Subclass of: UIViewController). Выделите контроллер и в поле Class секции Identity inspector укажите имя только что созданного класса. Осталось добавить связь между UIImageView и самим классом. Дайте имя объекту imageViewPreview.  После @IBOutlet добавьте идентификатор private. Это позволит скрыть UIImageView от других контроллеров.

Также создадим параметр типа UIImage c именем «currentPhoto». В него мы будем передавать изображение из выбранной ячейки. Но просто задать объект изображения недостаточно. Необходимо отображать новое изображение каждый раз, когда попадаем на PreviewVC. Для этого добавим метод viewWillAppear() и в его теле будем передавать объекту imageViewPreview объект currentPhoto. В результате класс должен содержать следующий код:

UICollectionViewController

Пришло время заняться и главным виновником данного урока — контроллером коллекции. Добавьте новый класс под названием «GalleryCVC» (Subclass of: UICollectionViewController) и укажите его в Identity inspector.

Откройте только что созданный класс и взгляните на его содержание. Как и в случае с UITableViewController, работа UICollectionViewController строится на основе data source и delegate. У данного класса они носят следующие имена:

  • UICollectionViewDataSource;
  • UICollectionViewDelegate.

Основными методами в дата сурсе являются:

  • numberOfSectionsInCollectionView: — запрашивает количетсво секций;
  • collectionView: numberOfItemsInSection: — запрашивает количество ячеек для каждой секции;
  • collectionView: cellForItemAtIndexPath: — просит саму ячейку.

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

Обратите внимание на начало кода в GalleryCVC — в шаблон класса уже добавлен идентификатор ячейки, который можно использовать:

Так как он совпадает с тем идентификатором, что был указан при построении интерфейса, его менять не будем. Перейдем к методу viewDidLoad(). Здесь имеется регистрация класса ячейки, который должен использоваться. Но так как мы добавили свой, он нам не нужен — закомментируйте его:

Опустившись ниже по коду, увидим набор методов дата сурса и различные методы делегата. Сперва, необходимо подготовить данные, которые будут отображаться в коллекции. Добавьте массив стрингов под названием «allPhotos» перед viewDidLoad(). В самом же методе, заполните массив названиями Ваших фотографий из asset-каталога. В результате начало класса должно выглядеть подобно этому:

Также укажем заголовок контроллера, но в этот раз не в storyboard, а с помощью кода. В том же методе viewDidLoad() добавьте следующий код:

Перейдем к заполнению методов data source:

Закончив работу с отображением контента, осталось лишь добавить передачу выбранного изображения из GalleryCVC в PreviewVC. Найдите и раскомментируйте метод prepareForSegue и напишите внутри него такой код:

Попробуйте «добраться» до объекта imageViewPreview из класса GalleryCVC.

Не получается? Всему виной идентификатор private, который мы указали при объявлении объекта. Старайтесь прятать внутренние (приватные) объекты от внешних контроллеров, если они им не нужны. Это является одним из правил хорошего тона в программировании.

Мы сделали всё что было нужно. Выберите модель iPhone 5 или 5s в качестве симулятора и запустите приложение. Вот что получилось у меня:

Галлерея с UICollectionViewController

GalleryCVC и PreviewVC

Убедитесь, что всё работает исправно. И теперь Вы с гордостью можете заявить, что написали первое приложение-галлерею! Поздравляем!