使用类似于新的Google Maps iOS应用程序的上滑视图,可能会遇到多个UIPanGestureRecognizer问题

我试图重现新的iOS谷歌地图应用程序的上滑菜单的行为。

所以基本上这是一个视图,你可以上下滑动到某个点,或者滑动到某个点。 此视图也可以像分页滚动视图一样向右和向左滑动。

它应该上下滚动或滑动到一边,但不是在同一时间。

经过大量的研究和testing,我得到的东西很接近,但并不像需要的那样工作。

我的实现是一个320×400的框架的UIScrollView和960×400分页滚动的内容视图。 然后我添加一个UIPanGestureRecognizer来处理整个视图的上移。

这是PanRecognizer的handleTouch IBAction:

- (IBAction)handlePan:(UIPanGestureRecognizer *)sender { NSLog(@"Panning"); CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self.view]; if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) { _firstX = [[sender view] center].x; _firstY = [[sender view] center].y; } if (!IS_IPHONE_5) { if (_firstY < 216) translatedPoint = CGPointMake(_firstX, 216); else translatedPoint = CGPointMake(_firstX, _firstY+translatedPoint.y); } else { if (_firstY < 307) translatedPoint = CGPointMake(_firstX, 307); else translatedPoint = CGPointMake(_firstX, _firstY+translatedPoint.y); } [[sender view] setCenter:translatedPoint]; if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) { CGFloat velocityY = (0.2*[(UIPanGestureRecognizer*)sender velocityInView:self.view].y); CGFloat finalX = _firstX; CGFloat finalY = translatedPoint.y + velocityY; if(finalY < _firstY) { if (IS_IPHONE_5) finalY = 307; else finalY = 216; } else if(finalY > _firstY) { if (IS_IPHONE_5) finalY = 605; else finalY = 515; } CGFloat animationDuration = (ABS(velocityY)*.0002)+.2; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:animationDuration]; [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(animationDidFinish)]; [[sender view] setCenter:CGPointMake(finalX, finalY)]; [UIView commitAnimations]; }} 

所以基本上,如果平底锅向上滑动而不是两侧。 我用这个handlePan方法的问题是,我不能让它工作,所以它不允许滚动高于一个点。 这是我想要做什么:

 if (_firstY < 216) translatedPoint = CGPointMake(_firstX, 216); else translatedPoint = CGPointMake(_firstX, _firstY+translatedPoint.y); 

最大的问题在于UIScrollView平移手势识别器正在处理与我添加的平移相同的平移。 这意味着如果我用手指向上滑动视图,UIScrollView也会同时滑到两侧。

同样的情况是,如果我试图滑到两侧,并将视图向上移动1像素,我的平底锅识别器结束并完全滑动视图。

我find的解决方法是设置我的泛识别器要求UIScrollview泛识别器无法工作。

 [_panGestureRecognizer requireGestureRecognizerToFail: _slideUpScrollView.panGestureRecognizer]; 

所以,现在当我滑到它的工作侧面,并不会移动视图。 问题在于,只有当你移开手指并且视图不滚动到两侧时,它才将自己设置为失败。 会发生什么事情,你不能平移视图了,但如果你在里面滑动,它会去“UIGestureRecognizerStateEnded”如果和幻灯片视图。

我查看了UIPanGestureRecognizer主题,并查看了几个选项,其中包括对我的泛识别器进行子类化,使其只识别滑盘,而不识别滑盘。

你们我认为我正在使用正确的策略,还是应该以另一种方式来看待?

理想的解决scheme是,当滑动到侧面时,它只能水平移动内容,并由UIScrollView处理,当logging水平摇摄时,它只能垂直摇动,并由panreconizer处理。 Safari与水平和垂直滚动的行为相同。 虽然我没有弄清楚如何实现。

感谢您的阅读,让我知道您的想法。 如果很多应用程序都有像Google地图那样的上滑菜单,那将会很棒!

编辑:我的目标是iOS 6。

好,我明白了!

我使用了UIPanGestureRecognizer中的例子- 只有垂直或水平方向才能将我的平移上下移动到垂直滚动状态,并在水平平移时使其处于失败状态。

我还使用了: 限制UIPanGestureRecognizer移动来阻止视图从平移到远程或远程。

最后,我将requiresToFail转换为:

 [_slideUpScrollView.panGestureRecognizer requireGestureRecognizerToFail:_panGestureRecognizer]; 

它在那里工作!

让我知道如果你有问题或有改进build议!

谢谢!