繁体   English   中英

UISwipeGestureRecognizer不起作用

[英]UISwipeGestureRecognizer not working

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

借用我在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调用以查看是否可以通过单指轻扫而无济于事。

我要在正确的视图中添加gestureRecognizers吗? 我尝试将其添加到UIView,UIScrollView以及self.view.superView。

示例代码运行良好。 我在代码的实现和示例代码之间看到的唯一区别是,我使用IB创建视图,而示例代码没有创建视图。 我怀疑某种东西正在消耗手势手势,然后才能传递给我的识别器。

我究竟做错了什么。

谢谢,

约翰

我遇到了同样的问题,我使用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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM