#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.