[英]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.