【问题标题】:Swift -- Need to click and drag a UIImageView inside a Custom TableView CellSwift - 需要在自定义 TableView 单元格中单击并拖动 UIImageView
【发布时间】:2015-12-31 05:43:15
【问题描述】:

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

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

其次,我无法在“cellForRowAtIndexPath”方法之外将“视图”投射到我的自定义 UITableViewClass(因此我可以访问我设置的网点。)

这是我的相关代码:

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)

        }
    }

感谢您的帮助...

【问题讨论】:

    标签: ios iphone swift uitableview uiimageview


    【解决方案1】:

    拖放后我想将 UIImage 视图返回到 它来自的单元格。

    • 使用transform 属性来操作 foodImageView
    • UIGestureRecognizer 的状态== UIGestureRecognizerState.Ended 时,实例化一个新的UIImageView 并将foodImageView 图像分配给新的UIImageViewimage 属性。
    • 将新的UIImageView 添加到所需的视图中。
    • foodImageView 的变换设置为CGAffineTransformIdentity 并为其设置动画。

    我会将编码留给您作为学习练习。作为参考,这里有一个关于 CGAffineTransform 的很好的解释:Demystifying CGAffineTransform

    我无法将“视图”投射到外部的自定义 UITableViewClass 'cellForRowAtIndexPath' 方法(这样我就可以访问 我已经设置了网点。)

    不要将UIPanGestureRecognizer 添加到foodImageView,而是将其添加到自定义UITableViewCell。然后,在您的wasDragged 函数中,访问UIGestureRecognizer.view,这是自定义UITableViewCell,然后访问foodImageView 属性。这将完全消除访问superview 属性的需要。在 UIKit 框架中访问 UI 元素上的 superview 属性绝不是一个好主意,因为 Apple 可以决定随时更改视图层次结构的结构。最终,您实际上是在猜测您将使用哪种视图并导致您未来的自我头痛。

    例如

    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)
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多