- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在同一个 View 中添加了一个滑动手势识别器和一个平移手势识别器。这些手势应该相互排斥。
为了做到这一点,我添加了对滑动手势的约束
[swipeGesture requireGestureToFail:panGesture];
(因为平移手势应该优先)
问题是平移手势总是被调用 - 即使是在非常快速的滑动过程中也是如此。
为了克服这个问题,我将自己设为平移手势的代表。在委托(delegate)方法中我设置了一些代码如下:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// check if it is the relevant view
if (gestureRecognizer.view == self.myViewWithTwoGestures)
{
// check that it is the pan gesture
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint velocity = [pan velocityInView:gestureRecognizer.view];
// added an arbitrary velocity for failure
if (ABS(velocity.y) > 100)
{
// fail if the swipe was fast enough - this should allow the swipe gesture to be invoked
return NO;
}
}
}
return YES;
}
是否有建议的速度来确保良好的行为?还有其他方法可以强制平移手势失败吗?
最佳答案
根据 Apple 文档 here (在 为两个手势识别器声明特定顺序 下)让 UIPanGestureRecognizer
和 UISwipeGestureRecognizer
在同一个 View 上工作的方法是要求UISwipeGesureRecognizer
在调用 UIPanGestureRecognizer
之前失败(与您编写的相反)。这可能与滑动手势也是平移手势这一事实有关,但反之不一定正确(请参阅此 SO 问题)。
我写了这段代码,它成功地识别了平移和滑动手势:
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panned:)];
UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swiped:)];
[pan requireGestureRecognizerToFail:swipe];
swipe.direction = (UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight);
-(void)panned:(UIPanGestureRecognizer *)gesture
{
NSLog(@"Pan");
}
-(void)swiped:(UISwipeGestureRecognizer *)gesture
{
NSLog(@"Swipe");
}
这并不像您希望的那样有效(因为您需要滑动手势失败,所以在平移手势开始之前会有一小段延迟)但它确实有效。但是,您发布的代码使您能够根据自己的喜好微调手势。
关于ios - 将 UIPanGestureRecognizer 和 UISwipeGestureRecognizer 添加到同一 View 会导致在设置 requireGestureToFail 后发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21723932/
我在同一个 View 中添加了一个滑动手势识别器和一个平移手势识别器。这些手势应该相互排斥。 为了做到这一点,我添加了对滑动手势的约束 [swipeGesture requireGestureToFa
我是一名优秀的程序员,十分优秀!