В UICollectionView в iOS 9 теперь легко передвигать ячейки.

Я пропустила это на WWDC 2015, но  iOS 9 UICollectionView теперь поддерживает перегруппировку ячеек стандартными API с помощью встроенных жестов long press и pan. Код для Swift 2.0 и Xcode 7 на Github.
Наиболее легкий способ добавить перегруппировку — это использовать subclass UICollectionViewController. У него есть новое свойство installsStandardGestureForInteractiveMovement, которое добавляет стандартные жесты для перегруппировки ячеек. Если его установить в true, то будет доступно перетягивание ячеек на новые места с помощью pan и «бросание» их на новом месте после того, как вы с помощью жеста long press выберите передвигаемую ячейку. Дополнительно вы должны реализовать два метода UICollectionViewDataSource.
Screen Shot 2015-07-20 at 12.00.29 PM
Первый метод позволяет вам передвигать элементы UICollectionView c определенным индексом indexPath, а второй — ответственен за перегруппировку DataSource (Модели данных для UICollectionView).
И это все! Мы получим коллекцию передвигаемых View ячеек всего за пару строк!
Давайте применим эту «пару строк» к нашему предыдущему приложению Smashtag с расположением ячеек в виде Pinterest и представленному в посте. Далее весь код приведен для Xcode 7.0 (бэта 3), Swift 2.0  и iOS 9.
Для этого добавим строку в viewDidLoad
Screen Shot 2015-07-20 at 12.13.25 PM
Далее реализует два метода UICollectionViewDataSource.
Screen Shot 2015-07-20 at 12.37.38 PM
И это действительно все. Теперь вы можете передвигать ячейки как для расположения ячеек в стиле Pinterest (Waterfall), так и в стандартном FlowLayout.
Код для Swift 2.0 находится на Github, результат — на видео.
Если вы хотите узнать тонкости работы с UICollectionView в iOS 9 рекомендую очень интересную статью.

Один комментарий к “В UICollectionView в iOS 9 теперь легко передвигать ячейки.

  1. Обратил внимание что ячейки путаются и немного изменил код в методе collectionView(_:moveItemAt:to:)

    let temp = images.remove(at: sourceIndexPath.item)
    images.insert(temp, at: destinationIndexPath.item)

    Тем самым я удаляю ячейку с ее изначального места в массиве images и потом снова вставляю на новую позицию 🙂

Обсуждение закрыто.