2016-12-16 7 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과 관련되어 있으며이를 수정하기 위해 또는 touchOffset 값을 절대로 사용하지 않습니다. 따라서 .changed 이벤트에서 프레임을 조정하는 것과 같은 방식으로 프레임을 조정 해보십시오.

UIView에있는 convert(_:to:) 방법이 두보기간에 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