UISwipeGestureRecognizer无法正常工作

use*_*859 0 iphone xcode swipe uigesturerecognizer

我在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];
Run Code Online (Sandbox Code Playgroud)

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
   return YES;
}
Run Code Online (Sandbox Code Playgroud)

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

我没有任何错误,但是当我用双指滑动时没有任何反应.不调用委托方法,也不是我的操作方法.我尝试删除numbeOfTouchesRequired调用,看看它是否可以单手滑动无效.

我是否将gestureRecognizers添加到右侧视图中?我尝试将它添加到UIView,UIScrollView以及self.view.superView.

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

我究竟做错了什么.

谢谢,

约翰

Joz*_*oze 7

我有同样的问题,我通过使用UIPanGestureRecognizer而不是UISwipeGestureRecognizer解决了.

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

如果x> 0,则右键滑动.

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

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

使用名为_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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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