2010-05-07 64 views
56

如何知道在使用UIGestureRecognizers时哪些子视图发生了事件?使用UITapGestureRecognizer时,请查找点击哪个子视图

根据文档:

手势识别上 触摸击中测试,以特定的视图 和所有视图的子视图的动作。

据我所看到的,“查看”属性是

视图手势识别是 附着到。

这将是父视图。

回答

162

这将在事件的位置找到最内层的后代视图。 (请注意,如果发现孩子视图有任何互动的内部私有孙子这段代码会发现那些过于。)

UIView* view = gestureRecognizer.view; 
CGPoint loc = [gestureRecognizer locationInView:view]; 
UIView* subview = [view hitTest:loc withEvent:nil]; 

在斯威夫特2:

let view = gestureRecognizer.view 
let loc = gestureRecognizer.locationInView(view) 
let subview = view?.hitTest(loc, withEvent: nil) // note: it is a `UIView?` 

在斯威夫特3:

let view = gestureRecognizer.view 
let loc = gestureRecognizer.location(in: view) 
let subview = view?.hitTest(loc, with: nil) // note: it is a `UIView?` 
+0

好极了!非常感谢 - 这真的帮助了我! – RPM 2013-04-09 22:37:15

+0

太棒了!这将有助于更多的不仅仅是这种情况:) – RileyE 2013-12-04 22:25:17

+10

只是想添加'hitTest:withEvent:'将尽可能远离儿童树。如果有任何子视图或子视图的子视图要忽略,则可以在这些视图上设置'userInteractionEnabled = NO'。 – robotspacer 2014-08-28 04:28:16

-1

对于未来的用户... 当世界不再使用obj-c时,我现在有了更好的选择...

[sender view]

使用这种方式:

UITapGestureRecognizer * objTapGesture = [self createTapGestureOnView:myTextField]; 

[objTapGesture addTarget:self action:@selector(displayPickerView:)]; 

//添加这些方法

-(void)displayPickerView:(UITapGestureRecognizer*)sender 
{ 
    UITextField *textField = (UITextField*)[sender view]; 
    NSLog(@"tag= %ld", (long)textField.tag); 
} 

-(UITapGestureRecognizer*)createTapGestureOnView:(UIView *)view 
{ 
    view.userInteractionEnabled = YES; 
    UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]init]; 
    tapGesture.numberOfTapsRequired = 1; 
    tapGesture.numberOfTouchesRequired = 1; 
    [view addGestureRecognizer:tapGesture]; 
    return tapGesture; 
} 
+0

- [UIGestureRecognizer视图]返回它附加的视图(按规范); OP对该视图的子视图感兴趣。 – 2017-03-22 22:56:34