我有一个UICollectionView
,里面有很多UICollectionViewCell
个。
搜索了很多,但在这个问题附近找不到任何东西。
我的目标是将其中一个粉红色方块(UICollectionViewCell
)拖到灰色视图(UIView
)。
您可以将其视为将桌面上的文件夹拖到垃圾桶,除非我不想删除粉红色方块。或者从停靠栏中拖出一个图标(它会快速向后移动)。
当粉红色区域碰到灰色区域时,它应该回到原来的位置,当使用某种简单的声明在其他任何地方辍学时也是如此。
任何人都可以帮助我或将我重定向到一些参考或样品吗? 非常感谢,如果您想了解更多信息。让我知道。
答案 0 :(得分:1)
如果我能够正确地理解你,我曾经做过一次非常相似的事情,我发现使用细胞的假图像而不是细胞本身会更好。
因此,例如,单元格编号2开始被拖动,您立即调用“SetHidden = YES”,并使用简单的绘制方法在完全相同的位置绘制一个假的:
UIGraphicsBeginImageContext(self.cell.bounds.size);
[self.cell.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
这个你可以随意移动,当它应该返回时,你也可以这样做。 希望这可以帮助你..
答案 1 :(得分:1)
这在swift 3中对我有用:
class DragAndDropGestureManager: NSObject {
var originalPosition: CGPoint?
var draggedView: UIView?
var viewSize: CGSize?
var originalZIndex: CGFloat = 0
@objc func handleDrag(_ recognizer: UIPanGestureRecognizer) {
switch recognizer.state {
case .began:
if let view = recognizer.view {
draggedView = view
originalPosition = view.frame.origin
viewSize = view.frame.size
originalZIndex = view.layer.zPosition
view.layer.zPosition = 1
}
case .changed:
if let view = recognizer.view {
let currentPosition = recognizer.location(in: view.superview!)
let newPosition = CGPoint(x: currentPosition.x - (viewSize!.width / 2.0), y: currentPosition.y - (viewSize!.height / 2.0))
view.frame.origin = newPosition
} else {
self.finishDrag()
}
case .ended:
finishDrag()
default:
print("drag default \(recognizer.state.rawValue)")
}
}
func finishDrag() {
self.draggedView?.frame.origin = originalPosition!
self.draggedView?.layer.zPosition = originalZIndex
originalZIndex = 0
originalPosition = nil
draggedView = nil
}
}
我在函数public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
中添加了一个手势识别器
像这样:
if self.dragManager != nil && cell.gestureRecognizers == nil {
cell.addGestureRecognizer(UIPanGestureRecognizer(target: dragManager!, action: #selector(DragAndDropGestureManager.handleDrag)))
}
if,是因为细胞被重复使用而不是多次添加gesutre识别
不要忘记添加 collectioView.clipToBounds = false
,否则当试图移出集合视图的边界时,被拖动的单元格将被裁剪