Ich habe eine Ansichtshierarchie, die ungefähr so aussieht:
UIView (A)
UIView > UIImageView
UIView > UIView (B)
UIView > UIView (B) > Rounded Rect Button
UIView > UIView (B) > UIImageView
UIView > UIView (B) > UILabel
Ich habe Gestenerkenner an meine UIView (B) angehängt. Das Problem, mit dem ich konfrontiert bin, ist, dass ich keine Aktionen für den abgerundeten Rechteck-Button bekomme, der sich in der UIView befindet (B). Der SingleTap-Gestenerkenner erfasst / überschreibt das Touch Up Inside-Ereignis der Schaltfläche.
Wie kann ich es zum Laufen bringen? Ich dachte, dass die Hierarchie der Antwortketten sicherstellen wird, dass das Tastenberührungsereignis bevorzugt wird und ausgelöst wird! Was vermisse ich?
Hier ist ein verwandter Code:
#pragma mark -
#pragma mark View lifecycle (Gesture recognizer setup)
- (void)viewDidLoad {
[super viewDidLoad];
// double tap gesture recognizer
UITapGestureRecognizer *dtapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognizer:)];
dtapGestureRecognize.delegate = self;
dtapGestureRecognize.numberOfTapsRequired = 2;
[self.viewB addGestureRecognizer:dtapGestureRecognize];
// single tap gesture recognizer
UITapGestureRecognizer *tapGestureRecognize = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureRecognizer:)];
tapGestureRecognize.delegate = self;
tapGestureRecognize.numberOfTapsRequired = 1;
[tapGestureRecognize requireGestureRecognizerToFail:dtapGestureRecognize];
[self.viewB addGestureRecognizer:tapGestureRecognize];
// add gesture recodgnizer to the grid view to start the edit mode
UILongPressGestureRecognizer *pahGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressGestureRecognizerStateChanged:)];
pahGestureRecognizer.delegate = self;
pahGestureRecognizer.minimumPressDuration = 0.5;
[self.viewB addGestureRecognizer:pahGestureRecognizer];
[dtapGestureRecognize release];
[tapGestureRecognize release];
[pahGestureRecognizer release];
}
#pragma mark -
#pragma mark Button actions
- (IBAction)buttonTouchUpInside:(id)sender {
NSLog(@"%s, %@", __FUNCTION__, sender);
}
#pragma mark -
#pragma mark Gesture recognizer actions
- (void)singleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"%s", __FUNCTION__);
}
- (void)doubleTapGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
NSLog(@"%s", __FUNCTION__);
}
- (void)longPressGestureRecognizerStateChanged:(UIGestureRecognizer *)gestureRecognizer {
switch (gestureRecognizer.state) {
case UIGestureRecognizerStateEnded: {
NSLog(@"%s", __FUNCTION__);
break;
}
default:
break;
}
}
Antworten:
Bei der Methode "shouldReceiveTouch" sollten Sie eine Bedingung hinzufügen, die NO zurückgibt, wenn sich die Berührung in der Schaltfläche befindet.
Dies ist aus dem Beispiel von Apple SimpleGestureRecognizers .
hoffe es wird helfen
Bearbeiten
Wie Daniel bemerkte, müssen Sie sich anpassen,
UIGestureRecognizerDelegate
damit es funktioniert.Shani
quelle
if ( [touch.view isKindOfClass:[UIControl class]] || [[touch.view superview] isKindOfClass:[UITableViewCell class]] ) {
... Beachten Sie, dass Tabellenansichtszellen in ihrer contentView, die Mitglied einer privaten Klasse ist, "berührt" werden. Daher überprüfen wir dort stattdessen die Klasse der Superview.Ich hatte auch das gleiche Problem, dann habe ich es mit versucht
Es funktioniert jetzt perfekt .........
quelle
myGestureRecognizer.delegate = self;
Im Allgemeinen verwenden wir die folgende Delegate-Methode, um die Berührung bei allen Arten von UIControls zu vermeiden:
Hinweis: Führen Sie diese Überprüfung NICHT durch (überprüfen Sie den Klassentyp erkenner.ansicht). GestureRecognizerShouldBegin, dies funktioniert nicht.
quelle
Hier ist eine Swift 3.0- Version:
Vergiss nicht:
Make your tapper object delegate to self (e.g: tapper.delegate = self)
quelle
Hier ist eine Swift-Version:
Vergiss nicht:
UIGestureRecognizerDelegate
tapper.delegate = self
)quelle
Die beste Lösung ist meiner Meinung nach die Verwendung des folgenden Code-Snippets:
quelle