如何使用iOS11 +拖放操作更改要拖动的单元格的背景?

时间:2018-09-25 17:53:06

标签: ios swift uicollectionview

我正在尝试在UICollectionView中实现新的拖放方法,但无法弄清楚如何从正在拖动的单元格中删除背景。

以下是问题的屏幕截图:

enter image description here

这是我正在尝试的代码:

func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters? {
    let parameters = UIDragPreviewParameters()
    parameters.backgroundColor = .clear
    return parameters
}

问题是,它实际上并没有起作用。背景仍然可见。我正在考虑使用visiblePath: UIBezierPath,但我认为它不会与文本配合使用。

有没有办法完全删除此背景?

2 个答案:

答案 0 :(得分:0)

我不确定没有使用UIBezierPath的方法。

以下是我为类似行为所做的示例:

final class CustomCell: UITableViewCell {
    @IBOutlet weak var mySuperLabel: UILabel!
    @IBOutlet weak var whiteSubview: UIView! // I have added a cornerRadius of 12.0 in the XIB
}

enter image description here

然后,委托方法:

func tableView(_ tableView: UITableView, dragPreviewParametersForRowAt indexPath: IndexPath) -> UIDragPreviewParameters? {
    let cell = tableView.cellForRow(at: indexPath) as! CustomCell
    let previewParameters = UIDragPreviewParameters()
    let path = UIBezierPath(roundedRect: cell.whiteSubview.frame, cornerRadius: 12.0)
    previewParameters.visiblePath = path
    previewParameters.backgroundColor = .clear
    return previewParameters
}

结果:

enter image description here

答案 1 :(得分:0)

另一种方法是在拖动开始时使用ItemProvider。

func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
    let itemProvider = NSItemProvider()
    let dragItem = UIDragItem(itemProvider: itemProvider)
    dragItem.previewProvider = { () -> UIDragPreview? in
        let cell = collectionView.cellForItem(at: indexPath) // Do cell preview modifications here
        cell?.layer.backgroundColor = UIColor.clear.cgColor
        cell?.backgroundColor = .clear
        return UIDragPreview(view: cell!)
    }
    return [dragItem]
}