在iOS7上,在应用开始和处理程序(状态开始)之间重置平移手势转换

jha*_*ott 18 uipangesturerecognizer ios7

我有一个平移手势识别器来向上,向下,向左或向右拖动面板.当无法使用平移的方向时,我不允许识别器开始,以便触摸可以转到面板内的其他UI元素.

但是,在iOS7上,翻译有时会在gestureRecognizerShouldBegin:我的手势处理程序之间重置handlePan:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer*)panGR
{
    CGPoint trans = [panGR translationInView:self.view];
    NSLog(@"should begin trans: (%.2f, %.2f)", trans.x, trans.y);
    ...
Run Code Online (Sandbox Code Playgroud)

这个日志: should begin trans: (18.00, 0.00)

- (void)handlePan:(UIPanGestureRecognizer*)panGR
{
    CGPoint trans = [panGR translationInView:self.view];

    switch(panGR.state)
    {
        case UIGestureRecognizerStateBegan:
            NSLog(@"handlePan began trans: (%.2f, %.2f)", trans.x, trans.y);
            ...
Run Code Online (Sandbox Code Playgroud)

这个日志: handlePan began trans: (0.00, 0.00)

这意味着共享代码,以确定所述锅体(右,在这种情况下)工作在的方向gestureRecognizerShouldBegin:和允许的手势开始,但随后不能被确定handlePan:时,stateUIGestureRecognizerStateBegan.

这是iOS7中的错误还是故意改变行为以适应新的手势类型?此外,任何人都可以建议一个解决这个问题的好方法吗?

XOX*_*OXO -1

您可以通过检查水平平移是否高于或低于 0 来确定方向。handlePan:但最后handlePan:您需要将平移重置CGPoint为下一个平移的新参考。

- (void)handlePan:(UIPanGestureRecognizer*)panGR
{
    CGPoint translation = [gr translationInView:self.view];
    if (translation.x > 0) {
        //Direction: Right
    } else if (translation.x < 0) {
        //Direction: Left
    }


    [gr setTranslation:CGPointZero
                inView:self.view];
}
Run Code Online (Sandbox Code Playgroud)