0

我有一个 MyUView 类型的 UIview V,其中包含一个名为 S1 的 stackView。S 堆栈包含一个名为 NM 的堆栈视图,其中包含一个名为 T 的 UITextField 和另一个名为 M 的堆栈视图,其包含一个名为 L 的 UILabel。为了简单起见,我使用字母来命名控件。

视图的层次结构如下:

    • S1
      • 纳米
          • 大号

为了识别长按手势,我在视图 V 中添加了一个名为 lprecognizer 的 LongPressGestureRecognizer。我想要在视图上检测 longPress 手势(以及可能的其他手势),但是,如果手势是 longpress 手势,我只想在 uitextfield T 是触摸视图时才执行特定操作。

我在 MyUView 中实现了以下委托方法:

- (Bool) gestureRecognizer: (UIGestureRecognizer*) gesturerecognizer shouldreceiveTouch: (UITouch*) touch {

  if (gestureRecognizer == lprecognizer)
  {
    if (touch.view == T) return YES;
    else return NO;
  }
  else return YES;
}

这不起作用(即使我触摸了文本字段),因为识别为被触摸手势的视图是 Stack S1,它是视图 V 的子视图数组中的第一个也是唯一一个视图(请记住前面提到的层次结构)。

我的问题是:

如果有任何简单的方法可以知道某个感兴趣的视图(例如 UITextField)是否在 gicen 触摸区域中,即使这个感兴趣的视图在视图层次结构中很深?

我想避免递归搜索视图层次结构的想法。

4

2 回答 2

0

像这样的东西应该工作:

UIView *hitView = [touch.view hitTest:[touch locationInView:touch.view] withEvent:nil];

if (hitView == T) {
    // etc
}
于 2016-09-29T06:42:36.433 回答
0

还有另一种方法可以通过像这样使用触摸点来识别

 let position = touch.locationInView(self)

 if CGRectContainsPoint(T.frame, position) {
      // you have touch on textField T
  }
于 2016-10-01T05:00:44.407 回答