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

时间:2014-03-12 16:51:08

标签: ios objective-c uicollectionview uicollectionviewcell

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

搜索了很多,但在这个问题附近找不到任何东西。

我的目标是将其中一个粉红色方块(UICollectionViewCell)拖到灰色视图(UIView)。 您可以将其视为将桌面上的文件夹拖到垃圾桶,除非我不想删除粉红色方块。或者从停靠栏中拖出一个图标(它会快速向后移动)。

当粉红色区域碰到灰色区域时,它应该回到原来的位置,当使用某种简单的声明在其他任何地方辍学时也是如此。

任何人都可以帮助我或将我重定向到一些参考或样品吗? 非常感谢,如果您想了解更多信息。让我知道。

enter image description here

2 个答案:

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