UIPanGestureRecognizer不会转发触摸

时间:2015-03-05 14:44:07

标签: ios objective-c uigesturerecognizer

我的UICollectionView中有几个UIViewController。在VC视图的顶部,我有一个UIGestureRecognizer

我希望UIGestureRecognizer启动,制作他的逻辑并将触摸转移到他们的事物的底层视图(比如滚动集合视图)。

我已将UIGestureRecognizer的属性cancelsTouchesInView设置为NO。但它没有任何帮助。

这些都没有帮助:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) {
        return YES;
    }
    return NO;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) {
        return YES;
    }
    return NO;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) {
        return YES;
    }
    return NO;
}

2 个答案:

答案 0 :(得分:0)

首先,UIGestureRecognizer是一个抽象基类。您必须指定其子类之一:UITapGestureRecognizer。 接下来,您必须设置其委托并从YES委托方法返回shouldRecognizeSimultaneouslyWithGestureRecognizer。 我认为它应该适用。

但是让我问你一句:为什么不首先使用你的集合视图委托方法didSelectItem:atIndexPath

答案 1 :(得分:0)

两年前我遇到了像你这样的问题,但我的问题是使用MKMapView而不是UICollectionView,但我相信我们可以解决它。

您是否检查过您可能没有收到委托邮件,因为UICollectionView正在消耗触摸并且您的手势永远不会到达?

  • 尝试在UICollectionVIew上附加手势,而不是在VC的视图上。

它应该可以工作,但如果没有,请尝试删除您的UICollection仅用于测试,将手势附加到VC的视图上并点击视图以确保手势正常工作。

  • 如果在视图的层次结构中没有UICollectionView,则UIGesture不起作用,则表示您没有正确初始化它。

好的,如果在VC的视图上附加了手势时调用了您的委托,但是在UICollectionView上附加了手势时,我很确定您的手势与UICollectionView的手势之间存在一些手势冲突。 / p>

  • 在这种情况下,循环您的UICollectionView的手势并要求您的手势失败响应。拿这个片段:

    for (UIGestureRecognizer *gesture in collectionView.gestureRecognizers) {
    
        [gesture requireGestureRecognizerToFail:yourGesture];
    }
    

或......

将UIView子类化,将其放在视图控制器的最顶层,在UICollectionView上方,并覆盖

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

方法,在里面做你的东西,然后返回nil将触摸传递到上面的视图......

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    //Do your stuff here ... you can also
    //return self; if you want to consume the touch

    //You can make this UIView's subclasse a "TouchDetector layer"
    //and call a delegate from here to notify other classes that 
    //this view is been touched...

    //returning nil, the touch will not be blocked and will be reached
    //by the view above it.
    return nil; 
}

我希望以上其中一个可以解决您的问题。或者至少带你走正路......