用垂直平移手势水平滚动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
。 将自定义滑动的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 }
我添加了一个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似乎有一个更好的方法为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; }