Как мне реализовать функции интерактивного перемещения UICollectionView в iOS 9?

#ios #swift #layout #uicollectionview #uikit

#iOS #swift #макет #uicollectionview #uikit

Вопрос:

В iOS 9 добавлена возможность касаться и удерживать, чтобы переставлять ячейки просмотра коллекции с минимальными усилиями. Включить эту возможность в тривиальной ситуации просто. Просто реализуйте одну функцию на своем UICollectionViewController .

func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath)

Если вам нужна дополнительная документация по этой функции, смотрите ее определение в UICollectionViewDataSource .

Однако это работает не только с пользовательским макетом. Что нужно, чтобы заставить это работать в более сложном случае?

Ответ №1:

Это плохо документировано, но для корректной работы есть 2 обязательных переопределения. В вашем UICollectionViewLayout подклассе реализуйте следующие 2 функции

 override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    return self.itemAttributes.filter { $0.frame.intersects(rect) }
}
  

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

 override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
    return self.itemAttributes.first(where: { $0.indexPath.item == indexPath.item })
}
  

Не уверен, зачем это необходимо, вы могли бы подумать, что UIKit мог бы вывести правильные атрибуты на основе предыдущих вызовов, но это не так. В любом случае, вам просто нужно иметь возможность извлекать правильные атрибуты для заданного indexPath.