Ios Swift--需要在自定义TableView单元格中单击并拖动UIImageView

Ios Swift--需要在自定义TableView单元格中单击并拖动UIImageView,ios,iphone,swift,uitableview,uiimageview,Ios,Iphone,Swift,Uitableview,Uiimageview,我正在尝试使用自定义UITableViewCell类创建自定义TableViewController。我需要能够将单元格内的照片拖放到视图底部的面板上。我已经尝试了几种方法来实现这一点,但我遇到了几个问题,还没有在网上找到完整的解决方案: 首先,在拖放之后,我想将UIImage视图返回到它来自的单元格 其次,我无法在“CellForRowatineXpath”方法之外向我的自定义UITableViewClass强制转换“视图”(因此我可以访问我设置的Outlet) 这是我的相关代码: overr

我正在尝试使用自定义UITableViewCell类创建自定义TableViewController。我需要能够将单元格内的照片拖放到视图底部的面板上。我已经尝试了几种方法来实现这一点,但我遇到了几个问题,还没有在网上找到完整的解决方案:

首先,在拖放之后,我想将UIImage视图返回到它来自的单元格

其次,我无法在“CellForRowatineXpath”方法之外向我的自定义UITableViewClass强制转换“视图”(因此我可以访问我设置的Outlet)

这是我的相关代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let thisCell:MealPlanTableViewCell = tableView.dequeueReusableCellWithIdentifier("mealPlanCell", forIndexPath: indexPath) as! MealPlanTableViewCell

    let meal = mealPlanElementArray[indexPath.row]

    thisCell.postTextLabel.text = meal.2
    thisCell.foodImageView.image = meal.4

    let gesture = UIPanGestureRecognizer(target: self, action: Selector("wasDragged:"))
    thisCell.foodImageView.addGestureRecognizer(gesture)
    thisCell.foodImageView.userInteractionEnabled = true

    return thisCell
}

func wasDragged(gesture: UIPanGestureRecognizer) {
    if calendarIsUp == calendarIsUp {
        let meal = gesture.view! as! UIImageView
        let sview = gesture.view!.superview!.superview!
        // CAN'T DO THE FOLLOWING -- CAN'T CAST TO CUSTOM CELL
        let mptvc:MealPlanTableViewCell = gesture.view!.superview!.superview! as! MealPlanTableViewCell

        if beginningDrag == true
        {


            beginningDrag = false

            // Move
            meal.superview?.superview?.superview?.superview?.superview?.superview?.superview?.addSubview(meal)

            beforeDragX = (meal.center.x)
            beforeDragY = (meal.bounds.maxY)

        }
        let translation = gesture.translationInView(self.view)

        meal.center = CGPoint(x: beforeDragX + translation.x, y: beforeDragY + translation.y)


        if gesture.state == UIGestureRecognizerState.Ended {

            beginningDrag = true
            // NEED TO ADD BACK TO custom UITableViewCell class.
            sview.addSubview(meal)
            meal.center = CGPoint(x: beforeDragX, y: beforeDragY)

        }
    }
谢谢你的帮助

拖放之后,我想将UIImage视图返回到 它来自的细胞

  • 使用
    transform
    属性操纵
    foodImageView
  • uigestureerecognizer
    的状态==
    uigestureerecognizer state.end
    时,实例化一个新的
    UIImageView
    并将
    foodImageView
    图像分配给新的
    UIImageView
    属性
  • 将新的
    UIImageView
    添加到所需视图
  • foodImageView
    的变换设置为
    CGAffineTransformity
    并设置动画
我将把编码留给您作为一个学习练习。以下是关于CGAffineTransform的一个很好的解释,仅供参考:

我无法在外部向自定义UITableViewClass强制转换“视图” “CellForRowatineXpath”方法(因此我可以访问 (我已经设置了出口。)

不要将
uipangestrerecognizer
添加到
foodImageView
中,而是将其添加到自定义
UITableViewCell
。然后,在拖动的
函数中,访问
UIgestureRecognitor.view
,这是自定义的
UITableViewCell
,然后访问
foodImageView
属性。这将完全消除访问
superview
属性的需要。在UIKit框架中访问UI元素的superview属性从来都不是一个好主意,因为苹果可以随时决定更改视图层次结构的结构。最终,你基本上是在猜测你将要使用哪个视图,并导致你未来的自我头痛

Ex.

func wasDragged(gesture: UIPanGestureRecognizer)
{
    if calendarIsUp == calendarIsUp
    {
        let cell = gesture.view! as! MealPlanTableViewCell

        if beginningDrag
        {
            beginningDrag = false

            beforeDragX = cell.foodImageView.center.x
            beforeDragY = cell.foodImageView.bounds.maxY

            // Move
            /*
                I have no idea what view this is so I don't know what to change it to.
            */
            cell.foodImageView.superview?.superview?.superview?.superview?.superview?.superview?.superview?.addSubview(cell.foodImageView)
        }

        let translation = gesture.translationInView(self.view)
        cell.foodImageView.center = CGPoint(x: beforeDragX + translation.x, y: beforeDragY + translation.y)

        if gesture.state == UIGestureRecognizerState.Ended
        {
            beginningDrag = true
            // NEED TO ADD BACK TO custom UITableViewCell class.
            cell.contentView.addSubview(cell.foodImageView)
            cell.foodImageView.center = CGPoint(x: beforeDragX, y: beforeDragY)

        }
    }
}