我在我的视图控制器中有几个UIScrollView
。 我想叠加一个视图,通过UIPanGestureRecognizer
捕获两个手指划动的操作,但不会记录UIScrollView
滑动手势。
当我用透明视图覆盖我的内容并使用2个手指进行平移手势时,我的轻触和1个手指划动操作都无法检测到。我尝试重写pointInside:
方法并返回NO
,但这样就无法记录我的2个手指的滑动操作。
效果类似于4个手指滑动以更改应用程序。
我在我的视图控制器中有几个UIScrollView
。 我想叠加一个视图,通过UIPanGestureRecognizer
捕获两个手指划动的操作,但不会记录UIScrollView
滑动手势。
当我用透明视图覆盖我的内容并使用2个手指进行平移手势时,我的轻触和1个手指划动操作都无法检测到。我尝试重写pointInside:
方法并返回NO
,但这样就无法记录我的2个手指的滑动操作。
效果类似于4个手指滑动以更改应用程序。
您不需要一个覆盖视图。
首先实现处理两根手指拖动的UIPanGestureRecognizer
,并将其分配给包含UIScrollView
的视图。
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc]
initWithTarget:self
action:@selector(handlePan:)];
panGestureRecognizer.delegate = self;
panGestureRecognizer.minimumNumberOfTouches = 2;
panGestureRecognizer.maximumNumberOfTouches = 2;
[self.view addGestureRecognizer:panGestureRecognizer];
使用 UIGestureRecognizerDelegate
处理带有 UIScrollView
平移手势的两个手指平移
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
最终,您能够处理两个手指的滑动操作
- (void)handlePan:(UIPanGestureRecognizer *)gestureRecognizer
{
NSLog(@"pan");
}
如果您想在检测到两个手指滑动时停止滚动 UIScrollView
,您可以禁用并启用 UIScrollView
滑动识别器。- (void)handlePan:(UIPanGestureRecognizer *)gestureRecognizer
{
if(gestureRecognizer.state == UIGestureRecognizerStateBegan)
{
_scrollView.panGestureRecognizer.enabled = NO;
}
if(gestureRecognizer.state == UIGestureRecognizerStateEnded)
{
_scrollView.panGestureRecognizer.enabled = YES;
}
NSLog(@"pan");
}
如果您不需要叠加层,只需使用手势识别即可解决此问题。我将其编写为测试:
- (void)viewDidLoad {
[super viewDidLoad];
self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
_scrollView.contentSize = CGSizeMake(self.view.bounds.size.width * 2, self.view.bounds.size.height);
UIView *green = [[UIView alloc] initWithFrame:self.view.bounds];
[green setBackgroundColor:[UIColor greenColor]];
UIView *blue = [[UIView alloc] initWithFrame:CGRectOffset(self.view.bounds, self.view.bounds.size.width, 0)];
[blue setBackgroundColor:[UIColor blueColor]];
[_scrollView addSubview:green];
[_scrollView addSubview:blue];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPan:)];
[pan setMinimumNumberOfTouches:2];
[pan setMaximumNumberOfTouches:2];
[pan setDelaysTouchesBegan:YES];
[_scrollView addGestureRecognizer:pan];
[self.view addSubview:_scrollView];
}
- (void)twoFingerPan:(UIPanGestureRecognizer *)gesture {
switch (gesture.state) {
case UIGestureRecognizerStateBegan:
self.scrollView.scrollEnabled = NO;
break;
case UIGestureRecognizerStateCancelled:
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateFailed:
self.scrollView.scrollEnabled = YES;
break;
default:
break;
}
NSLog(@"2 Fingers!");
}
当使用两个手指时,我会收到twoFingerPan:
回调。此时滚动视图的panGestureRecognizer
仍在工作,因此我禁用了滚动视图上的滚动以处理二指平移。我发现这种方法效果不错。但有一件有点奇怪的事情是如果滚动视图正在减速,则不会调用2指手势识别器。希望这可以帮到你!