水平滚动uiscrollview与垂直平移手势
-
12-12-2019 - |
题
我正在尝试实现一个uiscrollview,其中水平平移滚动滚动scrollview中的图片,但垂直平移执行我的另一个操作。现在我有一个uiscrollview,它禁用了垂直滚动,可以很好地滚动图片,但是我正在疯狂地试图找到一种方法来拦截垂直平移并调用我自己的方法,而不是垂直平移刚刚被scrollview吃掉。我能做到
UIPanGestureRecognizer *panUp = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[self.scrollView addGestureRecognizer:panUp];
[scrollView.panGestureRecognizer setEnabled:NO];
这使我完全控制了我手中的平移。:方法,但这并不是特别有用,因为那时我觉得我基本上要重写我试图避免的所有滚动逻辑。任何帮助或指导如何实现这一目标将不胜感激。
谢谢!
解决方案
我认为由于滚动视图使用这些手势而使用PAN手势,这将是困难的。但是,如果您可以使用刷卡,则易于实现。
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
swipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
[self.scrollView addGestureRecognizer:swipe];
.
我测试了这个,它的工作正常打电话给处理程序,你不需要禁用滚动视图的pan手势识别器(在我的测试中,滚动视图足够高,并且内容足够短,所以没有垂直滚动 - 我不知道这是必要的吗?
其他提示
截至iOS5, 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:
- (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;
}