我的UICollectionView中有两个部分。我希望能够在每个部分内拖动单元格,但不能在它们之间拖动。
我正在使用长按手势识别器来设置单元格拖动动画的动画,以便我可以检查放置位置不在不同的部分。有没有办法确定一个部分的框架?
或者有更简单的方法吗?
答案 0 :(得分:0)
在UICollectionViewDropDelegate
中,该协议func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal
可以提供帮助。
检查下面的示例,以了解如何防止某项从一个部分拖到另一部分:
在 UICollectionViewDragDelegate 中,我们使用itemsForBeginning
函数传递有关对象的信息。您可以看到,我将索引和项目传递给了localObject
func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
let item = sectionViewModel[indexPath.section].items[indexPath.row]
let itemProvider = NSItemProvider(object: item.title as NSString)
let dragItem = UIDragItem(itemProvider: itemProvider)
dragItem.localObject = (item, indexPath)
return [dragItem]
}
在 UICollectionViewDropDelegate 中,我这样做了:
func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal {
if let object = session.items.first?.localObject as? (Item, IndexPath), object.0.status, let destinationIndexPath = destinationIndexPath, object.1.section == destinationIndexPath.section {
let itemAtDestination = sectionViewModel[destinationIndexPath.section].items[destinationIndexPath.row]
if itemAtDestination.status {
return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
}
}
return UICollectionViewDropProposal(operation: .forbidden)
}
根据Apple:
当用户拖动内容时,集合视图会反复调用此方法,以确定如果放置在指定位置发生,您将如何处理。集合视图根据您的建议向用户提供视觉反馈。 在此方法的实现中,创建一个UICollectionViewDropProposal对象并使用它传达您的意图。由于在用户将鼠标悬停在表格视图上时会反复调用此方法,因此您的实现应尽快返回。
我做了什么: 我有几个限制要涵盖: