用垂直平移手势水平滚动UIScrollView

我试图实现一个UIScrollView水平平移滚动浏览图片的滚动视图,但垂直平移执行另一个行动,我有。 现在我有一个UIScrollView的分页与垂直滚动禁用,适用于滚动通过图片工作得很好,但是要疯狂试图find一种方法来拦截垂直平底锅,并调用我自己的方法,而不是垂直平底锅只是被吃掉scrollview。 我能做到

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

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

谢谢!

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

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

我testing了这个,并且它可以很好地调用处理程序,并且不需要禁用滚动视图的平移手势识别器(在我的testing中,滚动视图足够高,内容足够短,没有垂直滚动 – – 我不知道这是否有必要)。

从iOS 5开始, UIScrollView 公开了其UIPanGestureRecognizer 。 将自定义滑动的delegateself ,并使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 } 

我添加了一个UIPanGestureRecognizer然后设置gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:像这样:

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

我还在gestureRecognizerShouldBegin:添加了一个检查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似乎有一个更好的方法&#x4E3A;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; }