2016-04-03 84 views
0

我通过使用手势得到两个问题。首先,我想在双击时删除名为“panRecognizer”的手势,但不起作用。第二个问题我使用panRecognizer移动视图,但我无法移动到外边缘,在从视图到达边缘之前,它停止200或150 px。无法删除手势

这里是我的代码:

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