我对响应不正确子视图的手势识别器有疑问,有啥问题?

Posted

技术标签:

【中文标题】我对响应不正确子视图的手势识别器有疑问,有啥问题?【英文标题】:I have a problem with gesture recognizers responding to incorrect subviews, what gives?我对响应不正确子视图的手势识别器有疑问,有什么问题? 【发布时间】:2011-05-24 05:28:34 【问题描述】:

我有一个名为 ImageViewController 的父视图。在这个视图中,我最多添加了两个名为 ImageDetailViewController 的子视图。在这个细节视图控制器中,我声明了一些需要在它们各自的视图上执行某些操作的手势。代码如下:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeModeButtonPushed:)];
[tap setNumberOfTapsRequired:2];
[tap setNumberOfTouchesRequired:1];
[tap setDelegate:self];
[openGLView addGestureRecognizer:tap];
[tap release];

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(touchDidDrag:)];
[panRecognizer setMaximumNumberOfTouches:1];
[openGLView addGestureRecognizer:panRecognizer];
[panRecognizer release];

UIPanGestureRecognizer *shiftRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(shiftView:)];
[shiftRecognizer setMinimumNumberOfTouches:2];
[openGLView addGestureRecognizer:shiftRecognizer];
[shiftRecognizer release];

UIPinchGestureRecognizer *pinchRecog = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(viewPinched:)];
[openGLView addGestureRecognizer:pinchRecog];
[pinchRecog release];

因此,我需要在此父视图中将这些详细视图中的两个彼此相邻加载,然后我需要能够在一个视图或另一个视图上执行这些手势,并让该视图响应。

问题是当我用一根手指平移时,有时它会调用它应该调用的视图,但大多数情况下,它会触发另一个视图!这没有任何意义!我已经尝试过调试以及我能想到的所有其他事情,但我就是看不出两个单独声明的对象是如何像这样混在一起的。

为了让事情变得更奇怪,有些手势确实可以正常工作。因此,只有这一个手指平移手势才能搞砸一切。

我可能会错过什么?我怎么能调试这个?一切看起来就像这些对象确实是分开的,但它们的行为并不是那样......

【问题讨论】:

这些详细视图是什么样的? 【参考方案1】:

您可以通过找出手势识别器正在调用的视图来调试/解决此问题:看看这段代码:

(void)NAMEOFFUNCTION:(UITapGestureRecognizer*)识别器

if ([yourViewController.view pointInside:[recognizer locationInView:presentationSlideViewController.view] withEvent:nil]) 



过滤所有子视图,在这个例子中,我检查手指触摸是否低于定义的 x 和 y 坐标。首先检查该点是否在_buttonVIew子视图内://

if ([_buttonView pointInside:[recognizer locationInView:_buttonView] withEvent:nil]) 

然后查看触摸是否在低于50的坐标

    if (([recognizer locationInView:_buttonView].x < 50) && ([_leftArrow isEnabled])) 
        pageIndex -= 1;
    
   //otheriwse check to see if its over 970
        else if (([recognizer locationInView:_buttonView].x > 970) && ([_rightArrow isEnabled])) 
            pageIndex += 1;
        

    [self scrollViewScrollToRect:pageIndex];
    [self fadeArrows:1.0];
    return;

    

【讨论】:

以上是关于我对响应不正确子视图的手势识别器有疑问,有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

作为 UIWindow 子视图添加的 UIView 不响应点击

ios 滑动手势在子视图上未被识别,父视图上的手势

当滚动视图子视图不在屏幕上时,手势识别器不起作用

手势识别器无响应

响应一个手势识别器的多个可见视图

子视图中的手势识别器出现问题