如何使用UIScrollView滚动并拥有手势识别器?

时间:2014-05-24 03:30:49

标签: ios objective-c uiview uiscrollview

我在UIScrollView上有一个手势识别器,但它几乎不会被调用,因为UIScrollView会吃掉所有手势。

我用这一行部分解决了这个问题:[scrollView.panGestureRecognizer requireGestureRecognizerToFail:rightSwipe];但是,这一行导致我的识别器始终被接受(所需行为)并且滚动视图不滚动。

也就是说,滚动时,会接受识别器,但视图不会滚动。

我如何解决这个问题,还是有其他解决方案?

谢谢!

5 个答案:

答案 0 :(得分:17)

创建UIScrollView的子类。在新的子类中添加此方法

- (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer 
{
    return YES;
}

将scrollView类设置为新的scrollview子类。

答案 1 :(得分:3)

不要忘记为您的手势识别器机制分配适当的授权:

所以,例如:

设置.up方向手势识别器

let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
        swipeUp.direction = .up
        swipeUp.delegate = self // set delegate
        self.addGestureRecognizer(swipeUp)

设置.down方向手势识别器

let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(self.handleGesture(gesture:)))
        swipeDown.direction = .down
        swipeDown.delegate = self // set delegate
        self.addGestureRecognizer(swipeDown)

也不要忘记遵守代表团:

YourViewController: UIGestureRecognizerDelegate

设置同时识别:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }

然后继续你的逻辑......

希望它有所帮助!

答案 2 :(得分:2)

对我有效的方法是子类UIScrollView,并符合该子类中的UIGestureRecognizerDelegate。然后调用该方法。

class ATScrollView: UIScrollView, UIGestureRecognizerDelegate { 
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                           shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    } 
}

答案 3 :(得分:1)

Swift方法,
需要将UIGestureRecognizerDelegate添加到您的班级:

class ViewController: UIViewController, UIGestureRecognizerDelegate {

需要将其委托设置为self:

override func viewDidLoad() {
    super.viewDidLoad()
    var scrollView = UIScrollView(frame: self.view.frame)
    scrollView.delegate = self
}

将您的课程方法中的此部分添加到活动的同步手势中:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

答案 4 :(得分:0)

请原谅我这个切线,但我将发布此答案,以防其他人做出与我相同的误诊。如果像我一样上述解决方案对您不起作用,请确保您没有尝试将UISwipeGestureRecognizer附加到多个视图。它只能使用一个视图,而该视图将是它最近附加的视图!