如何获取层次结构中的哪个视图?

问题描述:

我有一个类型为MyUView的UIview V,它包含一个名为S1的堆栈视图。 S堆栈包含一个名为NM的堆栈视图,其中包含名为T的UITextField和名为M的另一个堆栈视图,其中包含名为L的UILabel。为了简单起见,我使用字母来表示控件的namid。如何获取层次结构中的哪个视图?

视图的层次结构如下:

  • V
    • S1
      • NM
        • Ť
        • 中号
          • 大号

我已经以识别长按手势添加了一个名为lprecognizer到视图V LongPressGestureRecognizer。我想要在视图上检测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; 
} 

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

我的问题是:

如果知道某个感兴趣视图(例如说一个的UITextField)没有简单的方法是在gicen触摸的区域,即使这种观点的兴趣是远远深在视图的层次结构中?

我想避免这样的想法,即递归地搜索视图的层次结构。

+0

识别“我想避免递归搜索的理念思想的层次意见“为什么?这就是系统正在做的事! – matt

+0

'UIView'上的'hitTest'有帮助吗? – Arthur

+0

hitText方法有助于在层次结构中深入一层,但它不会一路走向包含触摸点的最深节点......我希望有一种方法或一种简单的方法来做到这一点,但似乎我必须递归调用hitTest方法... – Airel

像这样的东西应该工作:

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

if (hitView == T) { 
    // etc 
} 
+0

这不工作...触摸视图现在是stackView NM ...我认为我可能最终会递归调用hitTest方法,直到获得的视图没有子视图(这是UITextField T的情况)...有没有人知道另一种方式呢? – Airel

有花药方式使用触摸点这样

let position = touch.locationInView(self) 

if CGRectContainsPoint(T.frame, position) { 
     // you have touch on textField T 
    } 
+0

那么,我最终最终会通过视图的层次结构递归搜索,因为Hittest不会在层次结构中一路走下去。此外,我还注意到,有时甚至在视觉上触摸点位于视图内时,当HitTest方法被调用并且使用触摸位置时,相同的视图不能识别其内部的触摸;所以,我决定在递归搜索中使用你建议我的CGRectContainsPoint方法。因此,尽管并非所有答案都是肯定的,但它可以帮助我找到答案。我会给你点的,谢谢!! – Airel