2016-06-04 7 views
1

에 CAShapeLayer 클릭 터치를 감지하는 경로를 원! 그것은 내가 화면을 클릭 할 때 어디에서나 작동하며, 파란색 공을 클릭 할 때 만 드래그하려고합니다.나는 빨간색으로 드래그 할 수있는 파란색 공을 만든 스위프트

이 내 코드는 지금까지 있습니다 :

override func viewDidLoad() { 
     super.viewDidLoad() 
circlePath2 = UIBezierPath(arcCenter: CGPoint(x: earthX,y: earthY), radius: CGFloat(10), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true) 
     shapeLayer2.path = circlePath2.CGPath 
     shapeLayer2.fillColor = UIColor.blueColor().CGColor 
     shapeLayer2.strokeColor = UIColor.clearColor().CGColor 
     shapeLayer2.lineWidth = 7 
     view.layer.addSublayer(shapeLayer2) 

     let dragBall = UIPanGestureRecognizer(target: self, action:#selector(ViewController.dragBall(_:))) 
     view.addGestureRecognizer(dragBall) 
} 
@IBAction func dragBall(recognizer: UIPanGestureRecognizer) { 
      let point = recognizer.locationInView(self.view) 
      let earthX = Double(point.x) 
      let earthY = Double(point.y) 
      let midViewXDouble = Double(midViewX) 
      let midViewYDouble = Double(midViewY) 
      let angleX = (earthX - midViewXDouble) 
      let angleY = (earthY - midViewYDouble) 
      angle = atan2(angleY, angleX) 
      let earthX2 = midViewXDouble + cos(angle)*100 
      let earthY2 = midViewYDouble + sin(angle)*100 
      circlePath2 = UIBezierPath(arcCenter: CGPoint(x: earthX2,y: earthY2), radius: CGFloat(10), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true) 
      shapeLayer2.path = circlePath2.CGPath 
} 

나는 dragBall 함수에 아래의 코드를 추가하려고로 한 Statment는 경우 : (사용자가 파란색 공에 정확히 닿을 경우 감지)

if ((point.x >= circlePath2.currentPoint.x - circlePath2.bounds.width/2) && (point.y <= circlePath2.currentPoint.y + circlePath2.bounds.height/2)) && ((point.y >= circlePath2.currentPoint.y - circlePath2.bounds.height/2) && (point.y <= circlePath2.currentPoint.y + circlePath2.bounds.height/2)){ 

효과가 있었지만 터치가 파란색 볼 위치를 벗어나지 않는 경우에만 드래그 할 수 있습니다. 예를 들어 터치 할 때만 볼을 터치하고 싶을 때와 같이 할 수 있습니다. 내 끌기는 비명에 어딘가에있다. 응 - 안돼.

바로 가기 : 터치 할 때만 공을 드래그 시작 & 내 터치가 화면 어디에서나 계속 끌면 계속 드래그합니다.

답변

0

dragBall 함수에서 제스처 인식기의 state 속성을 읽습니다. 상태가 UIGestureRecognizerStateBegan이고 터치가 파란색 공 안쪽에 있으면 제스처가 올바르게 시작되었으며 공이 안에 있지 않아도 다음 동작이 공의 위치에 영향을 줄 수 있습니다.

가장 좋은 방법은 UIGestureRecognizerDelegate에 맞는 동작을 만들 때 delegate을 제스처 인식에 할당 한 다음 gestureRecognizerShouldBegin: 기능을 구현하는 것입니다. 이 함수에서 터치가 파란 공 안에 있지 않으면 false를 반환합니다.

여기의 예 내가 대리인으로 무슨 말인지 :

class MyClass: NSObject, UIGestureRecognizerDelegate { 

    let ballView = UIView() 

    func createRecognizer() { 
     let recognizer = UIPanGestureRecognizer(target: self, action: #selector(MyClass.gestureRecognized(_:))) 
     recognizer.delegate = self 
     ballView.addGestureRecognizer(recognizer) 
    } 

    func gestureRecognized(recognizer: UIPanGestureRecognizer) { 
     // update ball position 
    } 

    func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
     let location = gestureRecognizer.locationInView(ballView) 
     return CGRectContainsPoint(ballView.bounds, location) 
    } 
} 
+0

당신이 예를 들어 줄 수 있습니까? UIPanGestureRecognizer를 UIGestureRecognizerStateBegan으로 변경하면 오류가 발생합니다. – Eliko

+0

하지만 공은 UIView가 아니며 CAShapeLayer는 – Eliko

+0

과 같은 개념입니다. 모양 레이어의 프레임을 가져 와서 터치가 프레임 안에 있는지 확인한 다음 제스처 인식기를 허용하거나 허용하지 않습니다. – daltonclaybrook