2010-05-07 4 views
56

Как узнать, какой из дочерних элементов просматривает событие при использовании UIGestureRecognizers?Найти, какой дочерний вид был использован при использовании UITapGestureRecognizer

Согласно документации:

Жест распознаватель работает на прикосновений хит-тестируемых к определенному мнению и все подвидов этого вида.

Насколько я могу видеть, свойство «вид» является

Вид жест распознаватель привязан.

который будет родительским.

ответ

162

Это обнаружит самый внутренний вид потомка на месте события. (Обратите внимание, что если эта точка зрения ребенок имеет какие-либо интерактивные внутренние частные внукам этот код будет найти их тоже.)

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

В Swift 2:

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

В Swift 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

+0

Удивительный! Это поможет с гораздо большим, чем просто этим случаем :) – RileyE

+10

Просто хотел добавить, что 'hitTest: withEvent:' будет идти так далеко по дереву детей, насколько это возможно. Если есть какие-либо подъязыки или подпункты subviews, которые вы хотите игнорировать, вы можете установить 'userInteractionEnabled = NO' в этих представлениях. – robotspacer

-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 view] возвращает вид, к которому он прикреплен (по спецификации); OP заинтересован в подсмотре этой точки зрения. –

Смежные вопросы