Finden Sie heraus, welche untergeordnete Ansicht bei Verwendung von UITapGestureRecognizer getippt wurde

69

Woher weiß ich, in welcher der untergeordneten Ansichten ein Ereignis aufgetreten ist, wenn UIGestureRecognizers verwendet wurden?

Laut Dokumentation:

Ein Gestenerkenner bearbeitet Berührungen, die auf eine bestimmte Ansicht und alle Unteransichten dieser Ansicht getestet wurden.

Soweit ich sehen kann, ist die Eigenschaft 'view'

Die Ansicht, an die der Gestenerkenner angehängt ist.

Dies ist die übergeordnete Ansicht.

LK.
quelle

Antworten:

203

Dadurch wird die innerste Nachkommenansicht am Veranstaltungsort gefunden. (Beachten Sie, dass dieser Code auch diese findet, wenn diese untergeordnete Ansicht interaktive interne private Enkelkinder enthält.)

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

In Swift 2:

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

In Swift 3:

let view = gestureRecognizer.view
let loc = gestureRecognizer.location(in: view)
let subview = view?.hitTest(loc, with: nil) // note: it is a `UIView?`
kennytm
quelle
Ausgezeichnet ! Vielen Dank - das hat mir wirklich geholfen!
RPM
Genial! Dies wird bei viel mehr als nur diesem Fall helfen :)
RileyE
11
Ich wollte nur hinzufügen, dass hitTest:withEvent:es so weit wie möglich in den Baum der Kinder geht. Wenn Unteransichten oder Unteransichten von Unteransichten vorhanden sind, die Sie ignorieren möchten, können Sie userInteractionEnabled = NOdiese Ansichten festlegen .
Robotspacer
1
Was ist, wenn wir nur eine Ebene tiefer gehen wollen?
John D.
1
@ JohnD. Suchen Sie .superviewiterativ, bis Sie das Original erreichen view.
Kennytm
-1

Für zukünftige Benutzer ... Ich habe jetzt eine bessere Option, wenn die Welt obj-c nicht mehr verwendet ...

[sender view]

benutze es so:

UITapGestureRecognizer * objTapGesture = [self createTapGestureOnView:myTextField];

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

// füge diese Methoden hinzu

-(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;
}
jeet.chanchawat
quelle
1
- [UIGestureRecognizer-Ansicht] gibt eine Ansicht zurück, an die sie angehängt ist (gemäß Spezifikation). OP interessiert sich für die Unteransicht dieser Ansicht.
Jason na