ios - 拖放 - UIGestureRecognizer - View 未添加到我想要的位置

标签 ios swift uigesturerecognizer

我在 splitViewController 中有这 2 个 tableView(所有可用服务和提供的服务)。这个想法是,然后单元格移动到屏幕中心,它移动到提供服务的 TableView 。 除了触摸`.began 之外,一切正常,单元格被添加到覆盖导航栏的 tableView 的顶部。 enter image description here

.changed 上它跟随我的手指 enter image description here

我希望在触摸开始的地方添加 View /单元格,在我触摸的“ServiceCell”之上。我尝试将它添加到 splitViewController.view 但我认为我的逻辑有问题。

这里是代码:

func didLongPressCell (gr: UILongPressGestureRecognizer) {
    let serviceCell:ServiceCell =  gr.view as! ServiceCell
    switch gr.state {
    case .began:

        let touchOffsetInCell = gr.location(in: gr.view)
        let dragEvent = DragganbleServiceCell()
        mDraggableServiceCell = dragEvent.makeWithServiceCell(serviceCell: serviceCell, offset: self.tableView.contentOffset, touchOffset: touchOffsetInCell)
        self.splitViewController?.view.addSubview(mDraggableServiceCell!)

    case .changed:
        let cp:CGPoint = gr.location(in: self.view)
        let newOrigin = CGPoint(x: (cp.x), y: (cp.y) - (mDraggableServiceCell?.touchOffset?.y)!)
        UIView.animate(withDuration: 0.1, animations: {
            self.mDraggableServiceCell?.frame = CGRect(origin: newOrigin, size: (self.mDraggableServiceCell?.frame.size)!)  
        })

    case .ended:
        let detailViewNC = self.splitViewController?.viewControllers[1] as! UINavigationController
        let detailView = detailViewNC.topViewController as! ServiceOfferedTableViewController
        if (mDraggableServiceCell?.frame.intersects(detailView.tableView.frame))! {

        onDragEnded(serviceCell:serviceCell)
        }else{

        mDraggableServiceCell?.removeFromSuperview()

        }
    default:
        print("Any other action?")
    }
}

DraggableServiceCell 中:

class DragganbleServiceCell: ServiceCell {

    var originalPosition:CGPoint?
    var touchOffset:CGPoint?

    func makeWithServiceCell(serviceCell:ServiceCell, offset:CGPoint, touchOffset:CGPoint)->DragganbleServiceCell{

        let newFrame =  CGRect(x: serviceCell.frame.origin.x, y: serviceCell.frame.origin.y, width: serviceCell.frame.size.width, height: serviceCell.frame.size.height)
        let dragCell = DragganbleServiceCell(frame: newFrame)
       dragCell.touchOffset = touchOffset
        dragCell.service = serviceCell.service
        dragCell.serviceName.text = serviceCell.service?.service_description
        return dragCell
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.containingView.backgroundColor = UIColor.rgb(230, green: 32, blue: 31)
        self.serviceName.textColor = .white
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

最佳答案

您的问题在 makeWithServiceCell(serviceCell:ServiceCell, offset:CGPoint, touchOffset:CGPoint) -> DragganbleServiceCell 中。您的 serviceCell 的框架是相对于包含它的 tableView 而不是 UISplitViewController 的 View ,并且您从不使用 offset touchOffset 值来纠正它。因此,请尝试按照您在 .changed 事件中执行的相同方式调整框架。

您甚至可能会发现 UIView 上的 convert(_:to:) 方法可能有助于在两个 View 之间进行 CGPoint 转换.查看更多详情 here .

关于ios - 拖放 - UIGestureRecognizer - View 未添加到我想要的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41190613/

相关文章:

ios - Swift:在自定义类中启动和停止事件指示器的动画

ios - 如何在 Swift 中使用 MapKit 在两个位置之间绘制路线?

swift - UIProgressView 和定期刷新(在 Swift 中)

ios - 结合向下滑动和长按

iphone - UITabBarItem 图像颜色为灰色,而原始图像为白色

ios - 在 iOS 中通过 Xcode UI XCTests 测试标签栏角标(Badge)

ios - 覆盖 AVPlayerViewController 中的框架手势

ios - 我可以将捏合手势识别器传递给 ScrollView 以使其缩放吗?

ios - 使用gmail api ios回复邮件

iOS 创建对象最佳实践