【问题标题】:Can't remove Gesture无法移除手势
【发布时间】:2016-04-03 11:55:52
【问题描述】:

我使用手势遇到了两个问题。首先,我想在双击时删除一个名为“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)
    }
}

【问题讨论】:

  • doubleTapped 消息是否被打印?
  • 是的,它打印在控制台中......
  • 你遇到了什么错误?你怎么知道手势没有被移除?
  • 再次双击后,比例变为 1,但 panGesture 仍处于活动状态。
  • 哦,我明白了问题所在。您的 panGesture 是方法内的局部变量。每次调用该方法时,它将是一个new。因此,即使您删除了old,新的也会被添加并仍然存在。您需要将其保存为实例变量。

标签: ios swift uipangesturerecognizer uitapgesturerecognizer


【解决方案1】:
for gesture in view.gestureRecognizers!
        {
            if let recognizer = gesture as? UITapGestureRecognizer {
                view.removeGestureRecognizer(recognizer)
            }
        }

希望这段代码能帮到你

【讨论】:

  • 这是从视图中删除所有手势的好方法,但在我的情况下,我不会删除所有手势,但 J.Wang 找到了解决我问题的方法。感谢您的宝贵时间
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多