Ios UICollectionView-将UICollectionView外部的单元格拖动到特定UIView

Ios UICollectionView-将UICollectionView外部的单元格拖动到特定UIView,ios,objective-c,uicollectionview,uicollectionviewcell,Ios,Objective C,Uicollectionview,Uicollectionviewcell,我有一个UICollectionView,里面有很多UICollectionViewCells 搜索了很多,但找不到与此问题相关的任何内容 我的目标是将其中一个粉色方块(UICollectionViewCell)拖动到灰色视图(UIView)。 你可以把它想象成把你桌面上的文件夹拖到你的垃圾桶里,除了我不想删除粉红色的方块。或者从dock中拖动图标(它会弹回来) 当粉色区域碰到灰色区域时,它应该回到原来的位置,在其他任何地方使用某种简单的语句退出时也应该如此 有人能帮我解决问题,或者让我参考一些

我有一个
UICollectionView
,里面有很多
UICollectionViewCell
s

搜索了很多,但找不到与此问题相关的任何内容

我的目标是将其中一个粉色方块(
UICollectionViewCell
)拖动到灰色视图(
UIView
)。 你可以把它想象成把你桌面上的文件夹拖到你的垃圾桶里,除了我不想删除粉红色的方块。或者从dock中拖动图标(它会弹回来)

当粉色区域碰到灰色区域时,它应该回到原来的位置,在其他任何地方使用某种简单的语句退出时也应该如此

有人能帮我解决问题,或者让我参考一些参考资料或样本吗? 非常感谢,如果你想要更多的信息。让我知道


如果我能正确理解你的意思,我以前也做过类似的事情,我发现最好使用细胞的假图像,而不是细胞本身

例如,单元格2开始被拖动,您立即调用“SetHidden=YES”,并使用简单的绘制方法在完全相同的位置绘制一个假单元格:

 UIGraphicsBeginImageContext(self.cell.bounds.size);
    [self.cell.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
这个你可以随意移动,当它返回时,你也可以用同样的方法。
希望这对您有所帮助。

这在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
否则,当尝试移出集合视图的边界时,拖动的单元格将被剪裁

好主意。也许这种方法会奏效。顺便说一句:对于iOS7,有一种新的UIView截图/快照方法,称为:-(UIView*)SnapshotViewAfterScreen更新:(BOOL)afterUpdates;你可以分享更具体的代码,这样我就可以使用你的代码。在你的回答中,我无法理解什么是dragManager!。我的要求与user023类似,但有一点变化:若我将粉色单元格拖到灰色单元格,粉色单元格将从collectionView中消失,灰色单元格将在第二个collectionView中。当粉红色变成灰色时,我需要执行一个动作。请帮助我,谢谢。self.dragManager是DragAndDropGestureManager的本地实例@user023想让他拖的牢房回到原来的地方,所以我就这么做了。如果要检测粉色单元格是否被拖动并释放到灰色正方形上,则需要将手势的位置从“.end”案例传递到视图控制器,并检查是否与灰色正方形相交。不要忘记将位置转换为相同的灰色正方形网格