【问题标题】:Horizontal scrolling UIScrollView with vertical pan gesture带有垂直平移手势的水平滚动 UIScrollView
【发布时间】:2012-09-23 13:26:26
【问题描述】:

我正在尝试实现一个 UIScrollView,其中水平平移滚动滚动视图中的图片,但垂直平移执行我拥有的另一个操作。现在我有一个 UIScrollView,它在禁用垂直滚动的情况下进行分页,它可以很好地滚动浏览图片,但是我疯狂地试图找到一种方法来拦截垂直平底锅并调用我自己的方法而不是垂直平底锅被吃掉滚动视图。我能够做到

    UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[self.scrollView addGestureRecognizer:panUp];
[scrollView.panGestureRecognizer setEnabled:NO];

这让我可以完全控制我的 handlePanGesture: 方法中的平移,但这并不是特别有用,因为我觉得我基本上要重写我试图避免的所有滚动逻辑。任何有关如何实现这一目标的帮助或指导将不胜感激。

谢谢!

【问题讨论】:

  • 你想用你的垂直平底锅做什么?是否涉及滚动?
  • 不涉及滚动。我有一个子视图,我想将其动画到滚动视图的同一个父视图中(滚动视图只占用其父视图的一部分)
  • 那我不明白你的说法:“我觉得我基本上要重写所有的滚动逻辑”。你的水平平底锅工作正常吗? panUp还被scrollView拦截吗?
  • 我知道我迟到了,但是将 shouldRecognizeSimultaneouslyWithGestureRecognizer 设置为 return YES 将可以解决此问题,但您还必须将平移手势 .delegate 设置为 self。我没有设置代表,它对我不起作用。我看到您在上面的代码中也遗漏了委托。希望这对未来的用户有所帮助。

标签: objective-c ios uiscrollview uipangesturerecognizer


【解决方案1】:

从 iOS 5 开始,UIScrollViewexposes its UIPanGestureRecognizer。将自定义滑动的delegate 设置为self 并将gestureRecognizer 设置为属性或ivar,并使您的类符合<UIGestureRecognizerDelegate> 协议。然后,像这样实现UIGestureRecognizerDelegate– gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([gestureRecognizer isEqual:self.swipe] && [otherGestureRecognizer isEqual:self.scrollView.panGestureRecognizer])
    {
         return NO;
    }
    return YES; // the default for this method
}

【讨论】:

  • 我喜欢这个答案,因为它通过平移手势而不是简单的滑动将更多的控制权放在我的手中。我的 uitableview 与左右平移手势同时工作时遇到问题。这解决了它。
  • 不起作用! otherGestureRecognizerUIScrollViewDelayedTouchesBeganGestureRecognizer 当然不等于 self.scrollView.panGestureRecognizer
  • 每个手势识别器都将调用该方法,这些手势识别器可能需要与您的对象作为委托的任何手势识别器同时识别。
【解决方案2】:

我添加了 UIPanGestureRecognizer 然后 setupgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 像这样:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture] && [otherGestureRecognizer isEqual:self.collectionView.panGestureRecognizer]){
        return YES;
    }
    return NO;
}

我还添加了签到gestureRecognizerShouldBegin:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture]) {
        if (gestureRecognizer.numberOfTouches > 0) {
            CGPoint point = [gestureRecognizer locationOfTouch:0 inView:gestureRecognizer.view];
            CGFloat distX = abs(self.collectionView.lastTouchPos.x - point.x);
            CGFloat distY = abs(self.collectionView.lastTouchPos.y - point.y);
            if (distX > distY) {
                return NO;
            }
        } else {
            return NO;
        }
    }
    return YES;
}

仅在向上或向下平移时使用self.panGesture

更新

https://stackoverflow.com/a/8603839/667834 似乎对gestureRecognizerShouldBegin 有更好的方法

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isEqual:self.panGesture]) {
        if (gestureRecognizer.numberOfTouches > 0) {
            CGPoint translation = [self.panGesture velocityInView:self.collectionView];
            return fabs(translation.y) > fabs(translation.x);
        } else {
            return NO;
        }
    }
    return YES;
}

【讨论】:

  • 为我工作,但我需要 fabs(translation.y)
【解决方案3】:

如果您想使用平移手势,我认为这会很困难,因为滚动视图使用了这些手势。但是,如果您可以使用滑动,则很容易实现。

    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
    swipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
    [self.scrollView addGestureRecognizer:swipe];

我对此进行了测试,调用处理程序可以正常工作,并且您不需要禁用滚动视图的平移手势识别器(在我的测试中,滚动视图足够高并且内容足够短以至于没有垂直滚动——我不知道这是否必要)。

【讨论】:

  • 您好,非常感谢您的帮助。这很有效,让我免于让自己更加疯狂地试图让平底锅工作。我避免使用滑动,因为我认为它不会响应屏幕上的缓慢拖动,但即使缓慢滑动它实际上也能很好地工作。再次感谢。
  • 没用。您是否尝试过自己滑动手势?使用它的可定制性不够。
猜你喜欢
  • 2013-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多