在 cell.content 中拖放包含自定义 UIView 的 UITableViewCell

Drag and Drop UITableViewCell which contains custom UIView in cell.content

如题,我是这方面的新手,想在 UITableView 中实现自定义拖放,而每个 UITableViewCell 内容(cell.content?)将包含一个自定义 UIView。例如。 Row1-cell-CustomUIView1,Row2-cell-CustomUIView2。将哪个自定义 UIView 添加到哪一行取决于用户对该行的选择和按钮点击。现在假设您有 4 个自定义 UIViews,即被添加到 UITableView 中的 4 个 rows/cells,我如何实现这些 CustomUIView 的拖放?请注意,每个自定义 UIView 可能与典型的 table 单元格不同。即自定义 UIView1 layout/design 不同于自定义 UIView2。在 swift 中实施,有什么想法吗?

这可能对您有帮助,将 UIPanGestureRecognizer 添加到 mainImgView 以处理拖动:

var draggableImage : UIImageView!
var mainImgView : UIImageView!
var trashImgView : UIImageView!
var dragStartPositionRelativeToCenter : CGPoint?
var panGesture : UIPanGestureRecognizer!

panGesture = UIPanGestureRecognizer(target: self, action: "handleDrag:")
mainImgView.addGestureRecognizer(panGesture)

func handleDrag(nizer: UIPanGestureRecognizer!) {
   if nizer.state == UIGestureRecognizerState.Began {
      self.draggableImage = UIImageView(image: mainImgView.image)
      self.draggableImage.frame = CGRectMake(0, 0, 100, 100)
      self.draggableImage.center = mainImgView.center
      self.draggableImage.contentMode = .ScaleAspectFit
      self.draggableImage.userInteractionEnabled = true
      self.draggableImage.alpha = 0.5

      self.view.addSubview(self.draggableImage)
      self.view.bringSubviewToFront(sself.draggableImage)

      let locationInView = nizer.locationInView(self.draggableImage.superview)
      dragStartPositionRelativeToCenter = CGPoint(x: locationInView.x - self.draggableImage.center.x, y: locationInView.y - self.draggableImage.center.y)

      self.draggableImage.layer.shadowOffset = CGSize(width: 0, height: 20)
      self.draggableImage.layer.shadowOpacity = 0.3
      self.draggableImage.layer.shadowRadius = 6

      return
  }

  if nizer.state == UIGestureRecognizerState.Changed {
     let locationInView = nizer.locationInView(self.draggableImage.superview)
     UIView.animateWithDuration(0.1) {
        self.draggableImage.center = CGPoint(x: locationInView.x - self.dragStartPositionRelativeToCenter!.x,
            y: locationInView.y - self.dragStartPositionRelativeToCenter!.y)
    }

      var checkAddToBag : Bool = CGRectContainsRect(self.draggableImage.frame, self.trashImgView.frame)

      if (checkAddToBag == true){
        self.trashImgView.layer.borderColor = UIColor.redColor().CGColor
        self.trashImgView.layer.borderWidth = 1.0
    } else {
        self.trashImgView.layer.borderColor = UIColor.clearColor().CGColor
        self.trashImgView.layer.borderWidth = 0.0
      }

      return
   }

   if nizer.state == UIGestureRecognizerState.Ended {
      var checkAddToBag : Bool = CGRectContainsRect(self.draggableImage.frame, self.trashImgView.frame)

      self.trashImgView.layer.borderColor = UIColor.clearColor().CGColor
      self.trashImgView.layer.borderWidth = 0.0

      dragStartPositionRelativeToCenter = nil

      self.draggableImage.removeFromSuperview()
      self.draggableImage = nil

      return
   }
}