【问题标题】:UISwipeGestureRecognizer not workingUISwipeGestureRecognizer 不工作
【发布时间】:2010-12-10 09:07:10
【问题描述】:

我在 UIScrollView 中有一个 UIView,两者都是使用 IB 创建的。 UIView 在 UIScrollView 内水平滚动。我想检测左右两指滑动。

借用我在SmpleGestureRecognizers中找到的示例代码,我将以下代码放在UIScrollView的ViewController的viewDidLoad方法中......

UIGestureRecognizer *recognizer;
UISwipeGestureRecognizer *swipeRightRecognizer, *swipeLeftRecognizer;

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
swipeRightRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeRightRecognizer.numberOfTouchesRequired = 2;
[self.view addGestureRecognizer:swipeRightRecognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
swipeLeftRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeLeftRecognizer.numberOfTouchesRequired = 2;
swipeLeftRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeLeftRecognizer];
[recognizer release];

我已经在 viewcontroller.h 中设置了。并具有以下委托方法...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
   return YES;
}

我假设这是一个有效的 gestureRecognizer 委托方法,但我在文档中找不到对它的任何引用。

我没有收到任何错误,但是当我用两根手指滑动时没有任何反应。委托方法没有被调用,我的操作方法也没有。我尝试删除 numbeOfTouchesRequired 调用以查看它是否可以通过单指滑动来工作,但无济于事。

我是否将手势识别器添加到正确的视图中?我尝试将它添加到 UIView、UIScrollView 以及 self.view.superView。

示例代码运行良好。我可以看到我的代码实现和示例代码之间的唯一区别是我使用 IB 创建视图而示例代码没有。我怀疑在滑动手势到达我的识别器之前,有什么东西正在消耗它。

我做错了什么。

谢谢,

约翰

【问题讨论】:

  • 一件事要提醒你手势识别器只能在 3.2 操作系统以上工作。最好使用触摸开始方法来代替滑动手势
  • 谢谢,我想这就是我要走的路。
  • 等待 iOS 5 SDK。 UiSwipeGestures 在 xcode 4.2 中集成到 IB 中,您可以轻松地将动作连接到手势!这样会轻松很多!

标签: iphone xcode uigesturerecognizer swipe


【解决方案1】:

我遇到了同样的问题,我通过使用 UIPanGestureRecognizer 而不是 UISwipeGestureRecognizer 解决了。

为了模拟滑动检测,我们将在滚动视图中使用手势速度。 如果 x 方向的速度 >= 3000(例如),则会检测到滑动。

如果 x>0,它将是向右滑动。

我为解决您的情况而实施的代码是: 在名为 _scroll1 的 uiscrollview 中:

UIPanGestureRecognizer *pan;
pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(Swipe4ScrollViews:)];
[pan setMinimumNumberOfTouches:2];
[_scroll1 addGestureRecognizer:pan];
[pan release];

使用名为 _panning 的全局 BOOL 变量,Swipe4ScrollViews 将完成这项艰巨的工作:

-(void)Swipe4ScrollViews:(UIPanGestureRecognizer *)sender 
{
    if(sender.state == UIGestureRecognizerStateBegan) _panning = NO;

    CGPoint v =[sender velocityInView:_scroll1];

    NSLog(@"%f, %f",v.x,v.y);

    if( (abs(v.x) >= UMBRAL) && !_panning)
    {
        _panning = YES;
        [sender cancelsTouchesInView];

        if(v.x>0) NSLog(@"Right");
        else NSLog(@"Left");

        [self doSomething];
    }
}

我将它封装在 UIGestureRecognizer 子类中:UISwipe4ScrollGestureRecognizer

【讨论】:

  • 何塞,谢谢。我会尝试你的方法,然后回复你它是如何为我工作的。再次感谢。约翰
【解决方案2】:

示例代码和你的代码最大的区别在于你的代码涉及到UIScrollView

在内部,滚动视图、表格视图和 Web 视图都在某种程度上使用了手势识别器。如果您希望在这些视图中接收手势(类似于内部已支持的手势),它们几乎肯定会在您到达它们之前被消耗或显着延迟。如果您的用例支持,接收外部上方这些视图的手势应该可以正常工作。

【讨论】:

    【解决方案3】:

    尝试将 UIScrollView 的 delayContentTouches-property 设置为 NO,也许会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多