2016-12-16 3 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) -> DragganbleServiceCellです。 serviceCellのフレームは、UISplitViewControllerのビューの代わりにtableViewに相対的なもので、offsetまたはtouchOffsetの値を決して使用していません。だから、.changedイベントでやっているのと同じようにフレームを調整してみてください。

UIViewconvert(_:to:)メソッドは、2つのビュー間でCGPointの変換を行うと便利な場合があります。詳細はhereを参照してください。

0

コードのこの部分を変更していない場合は、self.viewではなく、self.splitViewController?.viewにジェスチャを追加することをおすすめします。この

case .changed: 
    let cp:CGPoint = gr.location(in: self.splitViewController?.view) 
    UIView.animate(withDuration: 0.1, animations: { 
     self.mDraggableServiceCell?.center = cp 
    }) 

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

一度試してみてください。

+0

ジェスチャーがセルに追加されていますが、感謝します。さらに、 '.changed'は想定されていたとおりに動作します。問題は '.begin'です – mat

関連する問題