swift2 在Swift中从TableView拖放到另一个视图

5ktev3wc  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(239)

我试图复制一个项目从一个UITableView到另一个视图,我一直在敲打我的头在过去2天,我仍然无法找出如何完成这一点。
下面是我的UI架构的一个小草图

这是我正在做的
1.长按表格视图中的一行
1.长按时在单元格中创建图像的快照
1.将快照拖动到表视图外的视图(绿色区域
1.释放后,检查是否已将快照放入绿色视图区域。
我可以一直拖动到快照创建点,但当我尝试拖动快照时,我无法获得快照被拖动的点。当释放拖动时,我需要检查最后一个拖动点是否在DROP AREA(绿色)内。
有谁能给予一些见解,如何解决这个问题的一些示例代码...
提前感谢...

vbopmzt1

vbopmzt11#

目前我没有时间测试代码,但应该足够让代码有意义......您可以执行以下操作:

class ViewController: UIViewController, UITableViewDataSource {

    private var dragView: UIView?
    @IBOutlet weak var dropZone: UIView!

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

        let lpGestureRecognizer: UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(didLongPressCell))
        cell.contentView.addGestureRecognizer(lpGestureRecognizer)

        return cell
    }

    func didLongPressCell (recognizer: UILongPressGestureRecognizer) {
        switch recognizer.state {
        case .Began:
            if let cellView: UIView = recognizer.view {
                cellView.frame.origin = CGPointZero
                dragView = cellView
                view.addSubview(dragView!)
            }
        case .Changed:
            dragView?.center = recognizer.locationInView(view)
        case .Ended:
            if (dragView == nil) {return}

            if (CGRectIntersectsRect(dragView!.frame, dropZone.frame)) {
                if let cellView: UIView = (dragView?.subviews[0])! as UIView {
                    cellView.frame.origin = CGPointZero
                    dropZone.addSubview(cellView)
                }

                dragView?.removeFromSuperview()
                dragView = nil

                //Delete row from UITableView if needed...
            } else {
                //DragView was not dropped in dropszone... Rewind animation...
            }
        default:
            print("Any other action?")
        }
    }

}

更新备注:

当然,一种可能性是标记字段...如下所示:

private let imageViewTag: Int = 997
private let textLabelTag: Int = 998
private let detailTtextLabelTag: Int = 999

//...

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    //...
    cell.imageView?.tag = imageViewTag
    cell.textLabel?.tag = textLabelTag
    cell.detailTextLabel?.tag = detailTtextLabelTag
    //...

}

func didLongPressCell (recognizer: UILongPressGestureRecognizer) {
    //...
    case .Ended:
    let cellImageView: UIImageView? = recognizer.view?.viewWithTag(imageViewTag) as? UIImageView
    let cellTextLabel: UITextField? = recognizer.view?.viewWithTag(textLabelTag) as? UITextField
    let cellDetailTextLabel: UITextField? = recognizer.view?.viewWithTag(detailTtextLabelTag) as? UITextField
    //...
}
5uzkadbs

5uzkadbs2#

正义的道路是复杂的。如果你够男人
1.放弃对ios 10和更早版本的支持,将部署目标提升到ios 11
1.采用UITableViewDragDelegate协议2.1 [可选]启用dragInteractionEnabled = true,使表在iPhone中工作(默认情况下,拖动仅在iPad上工作)
1.学习https://developer.apple.com/documentation/uikit/drag_and_drop/making_a_view_into_a_drop_destination以检查如何将绿色区域设置为拖放目的地
1.在wwdc 2017中观看大约4个拖放相关视频或浏览其ascii版本
作为奖励,你可以在应用程序之间拖放,而不仅仅是在你的应用程序内部。

相关问题