ios - 制作类似于新的谷歌地图 iOS 应用程序的向上滑动 View ,多个 UIPanGestureRecognizer 的麻烦

标签 ios google-maps uiscrollview slideup uipangesturerecognizer

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

所以基本上它是一个 View ,您可以通过平移向上滑动到某个点或向下滑动到某个点。此 View 也可以像分页 ScrollView 一样向右和向左滑动。

它应该上下滚动或滑动到一边,但不能同时进行。

经过大量研究和测试后,我得到了一些接近但无法正常工作的东西。

我的实现是一个 UIScrollView,其框架为 320x400,内容 View 为 960x400,具有分页滚动功能。然后我添加一个 UIPanGestureRecognizer 来处理整个 View 的向上滑动。

这是 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];
    }}

所以基本上,如果平移将 View 向上滑动而不是向两侧滑动。这个 handlePan 方法的问题是我不能让它工作,所以它不允许滚动到高于一个点。这是我正在尝试做的事情:

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

认为最大的问题是 UIScrollView 平移手势识别器与我添加的识别器同时处理平移。这意味着如果我用手指向上滑动 View 并将其移动到两侧,则 UIScrollView 会同时向上和向两侧滑动。

如果我尝试仅向两侧滑动并将 View 向上移动 1 个像素,则会发生同样的情况,我的平移识别器结束并完全向上滑动 View 。

我找到的解决方法是将我的平移识别器设置为要求 UIScrollview 平移识别器无法工作。

[_panGestureRecognizer requireGestureRecognizerToFail:    _slideUpScrollView.panGestureRecognizer];

所以现在当我滑到两侧时它起作用并且不会向上移动 View 。问题在于,只有当您移开手指并且 View 没有滚动到两侧时,它才会将自己设置为失败。发生的情况是您无法再向上平移 View ,但如果您在内部向上滑动,则如果向上滑动 View ,就会出现“UIGestureRecognizerStateEnded”。

我查看了 UIPanGestureRecognizer 主题并查看了几个选项,包括将我的平移识别器子类化以使其仅识别向上滑动的平移,而不识别侧面的平移。

你们认为我使用的策略是正确的还是我应该换个角度看?

理想的解决方案是,当记录到侧面的幻灯片时,它仅水平移动内容并由 UIScrollView 处理,而当记录水平平移时,它仅垂直平移并由我的 panreconizer 处理。 Safari 的水平和垂直滚动行为相同。虽然我没有弄清楚如何实现它。

感谢阅读,让我知道您的想法。如果许多应用程序都像 Google map 一样具有出色的向上滑动菜单,那就太好了!

编辑:我的目标是 iOS 6。

最佳答案

好的,我明白了!

我使用了 UIPanGestureRecognizer - Only vertical or horizontal 中的示例将我的平移限制为垂直滚动,并在水平平移时将其设置为失败状态。

我还用过:Restricting UIPanGestureRecognizer movement阻止 View 向上或向下平移。

最后我将 requiresToFail 反转为:

[_slideUpScrollView.panGestureRecognizer requireGestureRecognizerToFail:_panGestureRecognizer];

成功了!

如果您有任何问题或有改进建议,请告诉我!

谢谢!

关于ios - 制作类似于新的谷歌地图 iOS 应用程序的向上滑动 View ,多个 UIPanGestureRecognizer 的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307000/

相关文章:

php - 如何从反向地理编码 JSON 结果中获取格式化地址?

javascript - google.maps.places.Autocomplete 无法使用 SimpleHTTPServer

ios - UIScrollView 中的 UIWebView 具有自动布局

ios - Xcode,急救员

ios - iOS 应用程序的 Jenkins 代码签名失败

javascript - Google Maps API 未显示引导元素和固定导航栏

ios - 动态检测 UIScrollView 的高度

ios - 如何从字典中获取一个字符串并确保它不为空? ( swift/iOS)

ios - 奇怪的位移结果

ios - 如何让 UIScrollView 不显示开始和结束空间