这次碰到这样一个问题,在一个自定义的view里面添加了 手势,控制左右滑动。这个view加在一个 scrollView 里面,然后发现,手指在 自定义view区域内部滑动时,scrollView的滑动是失效的,也就是说滑动事件被自定义的view 拦截了。现在要做到 左右滑动时自定义view去响应,上下滑动时,作为容器的scrollView 去响应,应该怎么做呢。找到个办法。
UIGestureRecognizer有两个委托方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
这两个委托方法第一个是控制 当前手势是否需要开始,第二个委托方法控制手势是否允许联动,即同时让多个手势得到响应。
再配合另一个重要的方法,
UIPanGestureRecognizer 有一个计算滑动量的方法
- (CGPoint)translationInView:(nullable UIView *)view;
对得到的量计算x 方向与 y的值,可以判断出滑动的方向。
第一个回调中,判断如果是当前view在响应滑动,那么上下方向的滑动被忽略掉,只响应左右方向
第二个回调中,判断,如果是上下方向的滑动,则允许联动,如果是左右方向的滑动,则只允许当前view响应。
具体代码如下
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if ([gestureRecognizer.view isKindOfClass:[DHGridView class]]) {
CGPoint translation = [(UIPanGestureRecognizer *)gestureRecognizer translationInView:self];
if (fabs(translation.x)<fabs(translation.y)) {
//上下方向的滑动
return NO;
}
}
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
CGPoint translation = [(UIPanGestureRecognizer *)gestureRecognizer translationInView:self];
BOOL shouldSimultaneous = NO;
if (fabs(translation.x)<fabs(translation.y)) {
//上下方向的滑动
shouldSimultaneous = YES;
}
return shouldSimultaneous;
}