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

标签 ios objective-c uikit uigesturerecognizer

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

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

顶部的 UIView(标签: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];

这是处理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 页)我看到落在点击区域约束内的第一个 View 是获得 HitTest 的 View ,在本例中为 tag:41。我需要 tag:22 来进行 HitTest ,因为还有另一个 UIView (tag:100) 位于 tag:41 的上半部分,它也可以识别点击...

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

最佳答案

尝试将其附加到整个 View ,实现委托(delegate)方法

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

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

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

匹配他们

关于ios - 如何将 UIGestureRecognizer 限制为特定的 UIView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15370545/

相关文章:

javascript - 难以点击触摸屏上的链接

ios - 一段时间后通过编码自动从相机捕获图像

ios - 使 TextView 的一半文本颜色不同于其他 50% 的文本 SWIFT

ios - UIActivityViewController 分享图片到微信不起作用

ios - 在 TableView 中将 NSarray 排列为 1-5、5-10、10-15

objective-c - 修复UILabel的边框

ios - 如何在 iOS 中动态地在 UIView 中制作不同的圆角值?

iPhone - 用于计算的正确 UI 控件

iphone - 在 UIButton 实例中发送额外参数

objective-c - 不断填充一个tableview