0

我有一组像这样分层的 UIView:

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

顶部的 UIView (tag:22) 是唯一一个我希望点击被识别的 UIView。使用 NSLog,标签总是引用标签: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];

这是处理水龙头的代码(也放在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 来进行命中测试,因为还有另一个 UIView (tag:100) 位于 tag:41 的上半部分,它也可以识别水龙头......

更新: 我添加了处理水龙头的代码......有没有一种方法可以以编程方式拒绝水龙头,除非它用于 UIVIew 标签:22?

4

1 回答 1

4

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

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

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

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

匹配他们

于 2013-03-12T19:51:49.460 回答