Я пропустила это на WWDC 2015, но iOS 9 UICollectionView теперь поддерживает перегруппировку ячеек стандартными API с помощью встроенных жестов long press и pan. Код для Swift 2.0 и Xcode 7 на Github.
Наиболее легкий способ добавить перегруппировку — это использовать subclass UICollectionViewController. У него есть новое свойство installsStandardGestureForInteractiveMovement, которое добавляет стандартные жесты для перегруппировки ячеек. Если его установить в true, то будет доступно перетягивание ячеек на новые места с помощью pan и «бросание» их на новом месте после того, как вы с помощью жеста long press выберите передвигаемую ячейку. Дополнительно вы должны реализовать два метода UICollectionViewDataSource.
Первый метод позволяет вам передвигать элементы UICollectionView c определенным индексом indexPath, а второй — ответственен за перегруппировку DataSource (Модели данных для UICollectionView).
И это все! Мы получим коллекцию передвигаемых View ячеек всего за пару строк!
Давайте применим эту «пару строк» к нашему предыдущему приложению Smashtag с расположением ячеек в виде Pinterest и представленному в посте. Далее весь код приведен для Xcode 7.0 (бэта 3), Swift 2.0 и iOS 9.
Для этого добавим строку в viewDidLoad
Далее реализует два метода UICollectionViewDataSource.
И это действительно все. Теперь вы можете передвигать ячейки как для расположения ячеек в стиле Pinterest (Waterfall), так и в стандартном FlowLayout.
Код для Swift 2.0 находится на Github, результат — на видео.
Если вы хотите узнать тонкости работы с UICollectionView в iOS 9 рекомендую очень интересную статью.
Обратил внимание что ячейки путаются и немного изменил код в методе collectionView(_:moveItemAt:to:)
let temp = images.remove(at: sourceIndexPath.item)
images.insert(temp, at: destinationIndexPath.item)
Тем самым я удаляю ячейку с ее изначального места в массиве images и потом снова вставляю на новую позицию 🙂