如何将 UIGestureRecognizer 限制为特定的 UIView?

Posted

技术标签:

【中文标题】如何将 UIGestureRecognizer 限制为特定的 UIView?【英文标题】:How to restrict UIGestureRecognizer to a particular UIView? 【发布时间】:2013-03-12 19:36:20 【问题描述】:

我有一组这样分层的 UIView:

界面窗口 UIViewController UIView(覆盖整个窗口;标签:41) UIView(标签:100(覆盖 UIView 的上半部分(标签:41)) UIScrollView(下半部分;标签:126) UIView(涵盖 UIScrollView;标签:21) UIView (tag:22)

顶部的 UIView (tag:22) 是唯一一个我希望点击被识别的 UIView。使用 NSLog,标签总是引用 tag:41。

这是我在 ViewController 中的代码(-viewDidLoad 方法):

    // Create and initialize a tap gesture  
 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
 tap.numberOfTapsRequired = 1;
 tap.numberOfTouchesRequired = 1;
 [self.view addGestureRecognizer:tap];

这是处理tap的代码(也放在VC中)

- (void)singleTap:(UIGestureRecognizer*)gestureRecognizer 

CGPoint pt = [gestureRecognizer locationInView:self.view];

UIView *v = [self.view hitTest:pt withEvent:nil];
NSLog(@"\n\nx: %ld\ny: %ld\ntag: %d",(long)pt.x, (long)pt.y, self.view.tag);

if ([v isKindOfClass:[SubViewData class]]) 
    NSLog(@"SubViewData!");
    return;

阅读事件处理指南(第 32 页)我看到第一个视图落入点击区域的约束是获得命中测试的视图,在本例中为 tag:41。我需要 tag:22 来进行命中测试,因为在 tag:41 的上半部分还有另一个 UIView (tag:100),它也可以识别水龙头...

更新:我添加了处理点击的代码...有没有一种方法可以以编程方式拒绝点击,除非它是针对 UIVIew tag:22 的?

【问题讨论】:

您在哪个视图中添加了手势识别器? 添加到 viewController for tag:41... tag:22 没有它自己的 VC...(我想我应该提到 UIWindow 和 UIView 之间有一个带有标签的 VC: 41) 为什么不直接将手势识别器添加到相关视图中? 无法识别...放入 -viewDidLoad... 没有任何反应! 【参考方案1】:

尝试将其附加到整个视图,实现委托方法

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)sender 
   return (CGRectContainsPoint(self.myTargetView.frame, [sender locationInView:self.view]);

如果您有多个UIGestureRecognizers 并且您为每个UIGestureRecognizers 委派,请使用:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)sender 
    if (self.neededGestureRecognizer == sender) 
       return (CGRectContainsPoint(self.myTargetView.frame, [sender locationInView:self.view]);
    
    return YES;

匹配他们

【讨论】:

您所说的“全视图”是什么意思? “实现委托方法”是什么意思? (对不起,蹩脚的问题,但之前从未使用过 UIGestureRecognizer) 我的意思是你的 UIViewController 的视图。 iFreeman:我用我现在拥有的代码更新了问题......它仍在报告标签:41......有没有办法我可以以编程方式拒绝标签:41的点击并让它走上链? 您是否尝试将 UIGestureRecognizer 直接附加到带有标签 22 的 UIView?我的意思是 [my22TaggedView addGestureRecognizer:myRecognizer]; ? 如果您的 22 标记视图是 UIScrollView 的子视图,也许您应该尝试使用 [recognizer locationInView:self.scrollView] 更新您当前的代码

以上是关于如何将 UIGestureRecognizer 限制为特定的 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

如果多个带有手势的视图重叠,如何将 UIGestureRecognizer 放在前面

UIGestureRecognizer 如何识别被点击的圆圈?

如何使用 UIGestureRecognizer 交换视图

如何用 UIGestureRecognizer 替换 TouchesBegan

使用 UIGestureRecognizer 模拟按钮单击

如何降低捏缩放 UIGestureRecognizer 的速度