我正在尝试使用UICollectionView通过将项目拖到最初为空的单元格上来设置项目数量的特定顺序。
在collectionView:dropSessionDidUpdate:withDestinationIndexPath:
中,如果项目在空单元格上方,则返回insertIntoDestinationIndexPath
的意图;如果项目在填充单元格上方,并且已经放置的元素应移至侧面,则返回insertAtDestinationIndexPath
。
我可以重新排列已经放置好的元素,当我将索引较低的项目拖到索引较高的元素上时,UICollectionView会将单元格正确地向左移动。
问题是,当我将新项目拖到CollectionView时,它在已经填充的单元格上方。没有地方可以向左移动单元格,因为CollectionView不会将我的“空”单元格视为空单元,并且无法向左移动填充单元格,这导致将所有填充和空单元格从CollectionView移到右侧
这是一个GIF,用于显示我的问题。
改变这种不断变化的可视化效果的最佳方法是什么?
我尝试在contentOffset
方法中更改UICollectionView的dropSessionDidUpdate
属性,但是这样会将所有单元格移到了一起,例如,我无法将最后一个单元格留在原地,并且将第二个单元格向左移容纳新物品。
我还尝试在CollectionView中重写长按手势处理,但是无法重现所有必需的行为,并且最终比UICollectionView本机版本差很多,所以我想知道,也许有一种更简单的方法。
我的细胞的模型:
struct Placing {
var letter: String?
var isEmpty: Bool {
return letter == nil
}
}
collectionView(_:cellForItemAt:)
:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if collectionView == sortedCollectionView {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SortedCell", for: indexPath) as! SortedCollectionViewCell
let placing = placings[indexPath.item]
if placing.isEmpty {
cell.backgroundColor = .white
cell.label.text = nil
} else {
cell.backgroundColor = .yellow
cell.label.text = placing.letter
}
return cell
} else {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "UnsortedCell", for: indexPath) as! UnsortedCollectionViewCell
cell.backgroundColor = .yellow
cell.label.text = letters[indexPath.item]
return cell
}
}
collectionView:dropSessionDidUpdate:withDestinationIndexPath
:
func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal {
if let indexPath = destinationIndexPath {
if placings[indexPath.item].isEmpty {
return UICollectionViewDropProposal(operation: .move, intent: .insertIntoDestinationIndexPath)
} else {
return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
}
}
return UICollectionViewDropProposal(operation: .cancel)
}
我已经制作了示例项目,以重现这种情况: https://github.com/Lieksu/CellAdjustment