2016-12-16 77 views
4

我在splitViewController中有2个tableViews(提供所有服务和提供的服务)。这个想法是,然后单元格移动到屏幕中心,它移动到服务提供的表格视图。 除了触摸`.began之外的所有东西都可以工作,单元格被添加到覆盖navBar的tableView顶部。 enter image description here拖放 - UIGestureRecognizer - 添加的视图不在我想要的位置

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

我想添加视图/小区的情况下触摸开始,对“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") 
    } 
} 

回答

2

你的问题是makeWithServiceCell(serviceCell:ServiceCell, offset:CGPoint, touchOffset:CGPoint) -> DragganbleServiceCellserviceCell的框架相对于包含它的tableView而不是UISplitViewController的视图,并且您从不使用offsettouchOffset值来更正此错误。因此,请尝试以与.changed事件中相同的方式调整框架。

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

0

如果您没有做和改变这部分代码,我会建议将手势添加到self.splitViewController?.view而不是self.view

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 .changed: 
    let cp:CGPoint = gr.location(in: self.splitViewController?.view) 
    UIView.animate(withDuration: 0.1, animations: { 
     self.mDraggableServiceCell?.center = cp 
    }) 

尝试一次。

+0

谢谢,但手势已添加到单元格。此外,'.changed'就像它应该的那样工作。问题出现在'.begin'中 – mat

相关问题