是否可以在将新项目拖动到其上方的同时更改UICollectionView动画以进行元素重排?

时间:2019-07-15 09:25:08

标签: ios swift uicollectionview

我正在尝试使用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

0 个答案:

没有答案