0

Я получаю две проблемы, используя жесты. Сначала я хочу удалить жест, называемый panRecognizer, при двойном нажатии, но он не работает. Вторая проблема Я использую panRecognizer для перемещения представления, но я не могу перемещаться на внешние края, он останавливается на 200 или 150 пикселей, прежде чем я достиг края из представления.Не удается удалить Жест

Вот мой код:

self.view.gestureRecognizers = self.pageViewController?.gestureRecognizers 
    let tap = UITapGestureRecognizer(target: self, action: #selector(miningCatalouge.doubleTapped(_:))) 
    tap.numberOfTapsRequired = 2 
    self.view.addGestureRecognizer(tap) 

} 

func doubleTapped(tap: UITapGestureRecognizer) { 

    let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(miningCatalouge.handlePan(_:))) 
    let curScale = self.view!.layer.valueForKeyPath("transform.scale.x")!.floatValue 

    if (curScale == 1) { 

     pageViewController!.view.userInteractionEnabled = false 
     self.view.transform = CGAffineTransformMakeScale(3, 3) 
     panRecognizer.minimumNumberOfTouches = 1 
     panRecognizer.maximumNumberOfTouches = 1 
     self.view.addGestureRecognizer(panRecognizer) 

    } else { 

    self.view.transform = CGAffineTransformMakeScale(1, 1) 
    self.view.center = CGPointMake(512, 391) 
    pageViewController!.view.userInteractionEnabled = true 

     //Don´t removed the gesture "panRecognizer" 
     self.view.removeGestureRecognizer(panRecognizer) 
    } 
    print("doubleTapped") 
} 

func handlePan(recognizer:UIPanGestureRecognizer) { 
    let translation = recognizer.translationInView(self.view) 
    if let view = recognizer.view { 
     view.center = CGPoint(x:view.center.x + translation.x, 
           y:view.center.y + translation.y) 
    } 
    recognizer.setTranslation(CGPointZero, inView: self.view) 



    if recognizer.state == UIGestureRecognizerState.Ended { 
     // 1 
     let velocity = recognizer.velocityInView(self.view) 
     let magnitude = sqrt((velocity.x * velocity.x) + (velocity.y * velocity.y)) 
     let slideMultiplier = magnitude/200 
     // print("magnitude: \(magnitude), slideMultiplier: \(slideMultiplier)") 

     // 2 
     let slideFactor = 0.1 * slideMultiplier  //Increase for more of a slide 
     // 3 
     var finalPoint = CGPoint(x:recognizer.view!.center.x + (velocity.x * slideFactor), 
           y:recognizer.view!.center.y + (velocity.y * slideFactor)) 
     // 4 
     finalPoint.x = min(max(finalPoint.x, 0), self.view.bounds.size.width) 
     finalPoint.y = min(max(finalPoint.y, 0), self.view.bounds.size.height) 

     // 5 
     UIView.animateWithDuration(Double(slideFactor), 
            delay: 0, 
            // 6 
      options: UIViewAnimationOptions.CurveEaseOut, 
      animations: {recognizer.view!.center = finalPoint }, 
      completion: nil) 
    } 
} 
+0

получают ли 'doubleTapped' сообщение печататься? –

+0

Да, это напечатано на консоли .... – Tom

+0

Какая ошибка у вас? Как вы знаете, что жест не удаляется? –

ответ

1
for gesture in view.gestureRecognizers! 
     { 
      if let recognizer = gesture as? UITapGestureRecognizer { 
       view.removeGestureRecognizer(recognizer) 
      } 
     } 

Надежда этот код может помочь

+0

это хороший способ удалить все жесты из представления, но в моем случае я не удалю все жесты, но J.Wang нашел решение для моей проблемы. Спасибо за ваше время – Tom

0

Вот решение от J.Wang:

class miningCatalouge: UIViewController, UIPageViewControllerDelegate, UIGestureRecognizerDelegate, UIScrollViewDelegate { 

     // I created a new Variable 
     var panRecognizer: UIPanGestureRecognizer? 

     override func viewDidLoad() { 
      super.viewDidLoad() 

      self.view.gestureRecognizers = self.pageViewController?.gestureRecognizers 
      let tap = UITapGestureRecognizer(target: self, action: #selector(miningCatalouge.doubleTapped(_:))) 
      tap.numberOfTapsRequired = 2 
      self.view.addGestureRecognizer(tap) 
//initialized action to panRecognizer 
      panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(miningCatalouge.handlePan(_:))) 

     } 

     func doubleTapped(tap: UITapGestureRecognizer) { 

      let curScale = self.view!.layer.valueForKeyPath("transform.scale.x")!.floatValue 

      if (curScale == 1) { 

       pageViewController!.view.userInteractionEnabled = false 
       self.view.transform = CGAffineTransformMakeScale(3, 3) 
       panRecognizer!.minimumNumberOfTouches = 1 
       panRecognizer!.maximumNumberOfTouches = 1 
       self.view.addGestureRecognizer(panRecognizer!) 

      } else { 

       self.view.transform = CGAffineTransformMakeScale(1, 1) 
       self.view.center = CGPointMake(512, 391) 
       pageViewController!.view.userInteractionEnabled = true 
       self.view.removeGestureRecognizer(panRecognizer!) 

      } 
      print("doubleTapped") 
     } 

     func handlePan(recognizer:UIPanGestureRecognizer) { 
      let translation = recognizer.translationInView(self.view) 
      if let view = recognizer.view { 
       view.center = CGPoint(x:view.center.x + translation.x, 
             y:view.center.y + translation.y) 
      } 
      recognizer.setTranslation(CGPointZero, inView: self.view) 

      if recognizer.state == UIGestureRecognizerState.Ended { 

       let velocity = recognizer.velocityInView(self.view) 
       let magnitude = sqrt((velocity.x * velocity.x) + (velocity.y * velocity.y)) 
       let slideMultiplier = magnitude/200 
       // print("magnitude: \(magnitude), slideMultiplier: \(slideMultiplier)") 

       let slideFactor = 0.15 * slideMultiplier  //Increase for more of a slide 

       let finalPoint = CGPoint(x:recognizer.view!.center.x + (velocity.x * slideFactor), 
             y:recognizer.view!.center.y + (velocity.y * slideFactor)) 

       UIView.animateWithDuration(Double(slideFactor), 
              delay: 0, 
              // 6 
        options: UIViewAnimationOptions.CurveEaseOut, 
        animations: {recognizer.view!.center = finalPoint }, 
        completion: nil) 
      } 
     } 
Смежные вопросы