0

我在 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 委托方法,但我在文档中找不到任何对它的引用。

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

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

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

我究竟做错了什么。

谢谢,

约翰

4

3 回答 3

7

我有同样的问题,我通过使用 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

于 2011-08-04T07:24:01.867 回答
1

示例代码和您的代码之间的最大区别在于您的代码涉及UIScrollView.

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

于 2010-12-10T09:15:16.247 回答
1

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

于 2011-01-11T17:40:34.063 回答