2016-06-04 8 views
1

ich einen blauen Ball gemacht, die in einem roten gezogen werden kann kreiste Pfad: enter image description hereTouch Erkennen Sie, wenn Sie auf CAShapeLayer in Swift

Die Funktion des Ziehens groß arbeitet, ABER! Es funktioniert, wo immer ich auf den Bildschirm klicke, und ich möchte es ziehen nur, wenn ich auf den blauen Ball klicke.

Dies ist mein Code so weit:

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 
} 

Ich habe versucht, den Code an die dragBall Funktion hinzuzufügen, als ob statment: (Es erkennt, ob der Benutzer genau auf die blaue Kugel berührt)

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)){ 

Und es hat funktioniert, aber ich kann es nur ziehen, wenn meine Berührung nicht verlassen, die blaue Kugel Position, zum Beispiel, wenn ich den Ball starten will berühren nur, wenn ich ihn berühren - ich kann, aber halte sie bewegen, wenn mein Ziehen ist irgendwo anders im Geröll n - Ich kann nicht.

Shortcut: Beginnen Sie, den Ball nur zu ziehen, wenn ich ihn berühre & weiterziehen, wenn meine Berührung irgendwo den Bildschirm ist.

Antwort

0

In Ihrer dragBall Funktion, lesen Sie Ihre Gestenerkenner state Eigenschaft. Wenn der Zustand UIGestureRecognizerStateBegan ist und die Berührung innerhalb der blauen Kugel ist, dann hat die Geste korrekt begonnen, und Sie können zulassen, dass die nachfolgenden Gesten die Position des Balls beeinflussen, auch wenn sie nicht innerhalb des Balls sind.

Der beste Ansatz wäre wahrscheinlich eine delegate auf die Geste zuweisen erkennen, wenn Sie es schaffen, die UIGestureRecognizerDelegate entspricht, dann implementieren die gestureRecognizerShouldBegin: Funktion. Wenn in dieser Funktion die Berührung nicht innerhalb der blauen Kugel ist, gebe false zurück.

Hier ist ein Beispiel dafür, was ich rede mit den Delegierten:

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

Können Sie ein Beispiel geben? wenn ich den UIPanGestureRecognizer zu UIGestureRecognizerStateBegan ändere gibt mir ein Fehler – Eliko

+0

Aber der Ball ist kein UIView, sein CAShapeLayer – Eliko

+0

Es ist das gleiche Konzept. Besorgen Sie sich den Rahmen der Formebene, prüfen Sie, ob sich die Berührung innerhalb des Rahmens befindet, und erlauben Sie dann (oder verbieten Sie), dass die Gestenerkennung beginnt. – daltonclaybrook

Verwandte Themen