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);
    ...

这记录: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);
            ...

这记录:handlePan began trans: (0.00, 0.00)

这意味着用于确定平移方向的共享代码(在本例中为右)工作gestureRecognizerShouldBegin:并允许手势开始,但无法在handlePan:何时确定stateis UIGestureRecognizerStateBegan

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

4

2 回答 2

1

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

于 2014-07-22T11:58:16.347 回答
-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];
}
于 2014-05-28T20:41:09.800 回答