2016-06-04 4 views
1

я сделал синий шар, который можно таскать в красный круг путь: enter image description hereDetect контакт, когда нажать на CAShapeLayer в Swift

Функция перетаскивания работает прекрасно, НО! Он работает везде, где я нажимаю на экран, и я хочу, чтобы он перетащил только, когда я нажимаю на синий шар.

Это мой код до сих пор:

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, как будто Постулаты: (Он обнаруживает, если пользователь прикасается точно на синий шар)

И это сработало, но я могу перетащить его только тогда, когда мое прикосновение не покидает положение синего шара, например, если я хочу начать касаться мяча только тогда, когда я прикасаюсь к нему - могу, но продолжаю двигаться, когда мое перетаскивание находится где-то еще в scree n - Я не могу.

Ярлык: Начните перетаскивать мяч только тогда, когда я касаюсь его & Держите перетаскивание, когда мое касание находится где угодно на экране.

ответ

0

В вашей функции dragBall прочитайте свой state свой знак распознавателя. Если состояние UIGestureRecognizerStateBegan, а прикосновение находится внутри синего шара, то жест начал правильно, и вы можете разрешить последующие жесты влиять на положение мяча, даже если они не находятся внутри мяча.

Лучший подход, вероятно, будет назначать delegate жесту распознать, когда вы создаете его, что соответствует UIGestureRecognizerDelegate, а затем реализовать функцию 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

 Смежные вопросы

  • Нет связанных вопросов^_^