iOS7上的手势平移在should-begin和处理程序之间被重置(状态为began)。

18
我有一个平移手势识别器,用于向上、向下、向左或向右拖动面板。当不可能进行平移时,我不允许识别器开始工作,以便触摸可以传递给面板内的其他UI元素。
但是,在iOS7上,有时在gestureRecognizerShouldBegin:和我的手势处理程序handlePan:之间,翻译会被重置。
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer*)panGR
{
    CGPoint trans = [panGR translationInView:self.view];
    NSLog(@"should begin trans: (%.2f, %.2f)", trans.x, trans.y);
    ...

这段代码记录了:应该开始转换:(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);
            ...

这条日志记录了:handlePan began trans: (0.00, 0.00)

这意味着用于确定滑动方向(在此为向右)的共享代码在gestureRecognizerShouldBegin:中起作用并允许手势开始,但是当stateUIGestureRecognizerStateBegan时,在handlePan:中无法确定该方向。

这是iOS7中的一个错误还是行为有意更改以适应新的手势类型?此外,有人能否提供一个解决此问题的好方法?

2个回答

1

UIPanGestureRecognizer 在达到 UIGestureRecognizerStateBegan 状态后总是将平移设置为 (0,0)。因为它设计成仅作为触发器工作,即使最轻微的平移也会被识别。如果您设置了大的阈值以开始识别,如 (50,50),那么显然会出现 UI 行为上的“滞后”。作为一种解决方法,建议您存储平移值,然后使用 UIView 动画更平滑地移动对象。应该使用 UIGestureRecognizerStateChanged 更新平移,使用 UIGestureRecognizerStateRecognized 设置拖动的结束点。


1
我认为你误解了问题。这个翻译重置发生在gestureRecognizerShouldBegin和状态为UIGestureRecognizerStateBegan的处理程序之间。我认为这是iOS7中的一个错误。 - jhabbott
我写“在达到UIGestureRecognizerStateBegan之后”时所想的是,在调用处理程序之前进行重置,对吗?我理解了这个问题并运行了一些代码来复现它 - 我同意您的观点,这种行为非常令人困惑,并且在某些情况下可能会引起麻烦,例如当您的gestureRecognizerShouldBegin实现仅在相对较大的转换发生时(即可以在屏幕上看到的距离,如您的(18.00, 0.00))返回YES。这就是我所理解的情况? - Wladek Surala

-1
handlePan: 中,您可以通过检查水平平移是否大于或小于 0 来确定方向。但是,在 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];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接