如何确定 UITapGestureRecognizer 触摸了哪个视图?

Posted

技术标签:

【中文标题】如何确定 UITapGestureRecognizer 触摸了哪个视图?【英文标题】:How to determine which view was touched by UITapGestureRecognizer? 【发布时间】:2013-08-27 00:17:09 【问题描述】:

我有一个带有子视图的UIScrollView 和一个UITapGestureRecognizer

我这样创建识别器:

UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)];
[self addGestureRecognizer:tgr];

UITapGestureRecognizer 的 view 属性指向滚动视图本身,即使用户触摸了不同的视图。我需要知道触摸是否直接在滚动视图上。

【问题讨论】:

sn-p代码中的self是什么?滚动视图?通常,您会执行 [self.whateverViewAspect addGestureRecognizer:] 以便专门将手势识别器附加到部分视图 尝试将滚动视图设置在单独的 UIView 对象之上?像 [viewWtihSCrollviewOnTopOf addSubview:scrollView]; [viewWtihSCrollviewOnTopOf addGestureRecognizer:tgr]; 【参考方案1】:

Paul 的建议很好,但如果您不想(或不能)子类化或成为识别器的代表,还有另一种方法。

您可以向手势识别器询问其locationInView:,然后使用scrollView 的hitTest:withEvent: 方法(在UIView 上定义)检索该点所在的视图。比如:

CGPoint location = [recognizer locationInView:scrollView];
UIView *touchedView = [scrollView hitTest:location withEvent:nil];

【讨论】:

【参考方案2】:

您可以成为UITapGestureRecognizer 的任一子类,并通过重写touchesBegan:withEvent: 方法来添加一个新的ivar 来保存此信息

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

  /*
   * If you wanted you could store a set of all the views to allow
   * for multiple touches
   */
  self.touchedView = [touches.anyObject view];
  [super touchesBegan:touches withEvent:event];

或者,如果您愿意,您可以成为UITapGestureRecognizer 的代表,并通过实现gestureRecognizer:shouldReceiveTouch: 将点击的视图作为属性存储在您的类中

【讨论】:

以上是关于如何确定 UITapGestureRecognizer 触摸了哪个视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定样本量

如何确定样本量

如何确定滚动视图中当前可见的区域并确定中心?

Flink on YARN时,如何确定TaskManager数

如何确定 div 是不是滚动到底部?

七步法计算测量不确定度:第四步