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.

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?`

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;
}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.