【问题标题】:UIPanGestureRecognizer does not forward touchesUIPanGestureRecognizer 不转发触摸
【发布时间】:2015-03-05 14:44:07
【问题描述】:

我的UIViewController 中有几个UICollectionView。在 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;
}

【问题讨论】:

  • 你告诉了你期望什么以及你做了什么。还请指定实际(当前)行为是什么。究竟发生了什么? gestureRecognizer 方法是否被执行但它不转发到底层视图?或者gestureRecognizer 方法本身没有被调用,但底层视图正在得到影响?或者两者都没有发生。

标签: ios objective-c uigesturerecognizer


【解决方案1】:

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

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

【讨论】:

  • 这不起作用:-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) { return YES; } 返回否; }
  • 关于第二个问题,didSelectItem:atIndexPath 不能满足我的需求
  • @Luda:请提供有关您的问题的更多信息。它太模糊了。所以你说的是 UIPanGestureRecognizer 和 UICollectionView 应该同时响应触摸?另外,我没有说要实现其他委托方法...
【解决方案2】:

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

您是否检查过您是否没有收到委托消息,因为 UICollectionView 正在消耗触摸并且您的手势从未达到?

  • 尝试将您的手势附加到 UICollectionVIew 而不是 VC 的视图上。

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

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

好的,如果当您的手势附加到 VC 的视图时调用了您的委托,而不是当您将其附加到 UICollectionView 时,我很确定您的手势和 UICollectionView 的手势之间存在一些手势冲突。

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

    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; 
}

我希望以上方法之一可以解决您的问题。或者至少带你走上正确的路……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多