2013-06-02 5 views
27

Essen Ich habe ein UIScrollView zu denen habe ich eine einzige Erkennungstippgeste zeigen/verstecken einige UI-Overlay mit:Scroll Gestenerkenner alle Touch-Ereignisse

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
[scrollView addGestureRecognizer:singleTap]; 

und:

- (void)handleTap:(UITapGestureRecognizer *)sender { 
    // report click to UI changer 
} 

I hinzugefügt ein easy table view an den unteren Rand der UIScrollView. Alles funktioniert richtig (Scrollen sowohl horizontal als auch vertikal), aber das Problem besteht darin, dass Taps nur durch den Gestenerkenner (oben) erkannt werden, aber nicht durch die einfache Tabellenansicht. Wenn ich die Zeile entferne, die den Gestenlistener registriert, funktioniert alles einwandfrei. Die Tabellenansicht bemerkt, dass sie auf sich selbst klopft.

Es ist, als ob die Gestenerkennungsfunktion die Tippereignisse in der Tabellenansicht "isst" und sie nicht nach unten ausbreitet.

Jede Hilfe ist

geschätzt

Antwort

61

Dies sollte Ihr Problem lösen.
Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]
Die Idee ist, dem Gestenerkenner zu sagen, dass er die Berührungsereignisse nicht verschluckt. Um dies zu tun, müssen Sie die Eigenschaft cancelsTouchesInView von singleTap auf NO setzen, was standardmäßig YES ist.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
singleTap.cancelsTouchesInView = NO; 
[scrollView addGestureRecognizer:singleTap]; 
+1

Das hat den Trick :) –

+2

Ich habe ähnliches Problem ([meine Frage] (http://stackoverflow.com/questions/33105678/in-ios-button-tapping-not-fired-when-keyboard-is- sichtbar)), aber die Lösung funktioniert nicht für mich. Manchmal wird das Ereignis ausgelöst, manchmal nicht. – new2ios

+1

das ist die endgültige Lösung.danke zambrey –

5

Sie können festlegen, welche Objekte für Berührungen einbezogen/ausgeschlossen werden sollen.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {    
    if (touch.view == [self view]) { 
     return YES; 
    } 
    return NO; 
} 
5

Ich denke, der Grund ist, dass User Interaction Enabled-false für UIImageView gesetzt. Sie sollten es auf true gesetzt

2

Dank @zambrey

Swift 2.2 + Version in es zu ermöglichen, tippen:

scrollView.delegate = self 

let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed)) 
allowMultipleTouches.numberOfTapsRequired = 1 
allowMultipleTouches.cancelsTouchesInView = false 

scrollView.addGestureRecognizer(allowMultipleTouches) 

Wenn Ihre Ansicht blättern im Storyboard ist, nicht zu vergessen Stecken Sie den Ausgang in den View-Controller. In diesem Beispiel ist scrollView der Ausgang des UIScrollView.

1

TapGestures arbeitete für mich. Der Swipe auf der anderen Seite, ich musste das Scrollen deaktivieren und es hat funktioniert.

 swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    swipeLeftGesture.direction = .left 
    scrollView.addGestureRecognizer(swipeLeftGesture) 

    swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:))) 
    scrollView.addGestureRecognizer(swipeRightGesture) 

    scrollView.isScrollEnabled = false 
5

Swift 3,0

let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) 
singleTap.cancelsTouchesInView = false 
singleTap.numberOfTapsRequired = 1 
scrollView.addGestureRecognizer(singleTap) 

Und die Auswahlmethode sein wie.

func handleTap(_ recognizer: UITapGestureRecognizer) { 
    // Perform operation 
} 
+0

Perfekte Lösung! –

1

Sie können jede Art von Gesten in UIscrollView erfassen. Stellen Sie sicher, dass Sie auch einige der Standardeigenschaften behandeln, wie zum Beispiel set cancelsTouchesInView property auf false, das ist standardmäßig true. Geben Sie auch einige Tag-Nos zu Ihren Unteransichten, um sie in Selektoren zu unterscheiden. & ermöglichen auch ihre Benutzerinteraktion zu wahren.

let Hahn = UITapGestureRecognizer (Ziel: Selbst, Aktion:

Selektor (didTapByUser (_ :)))

1

Dieser arbeitete für mich in Swift 3/Xcode 8

self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **) 
    self.scrollView.canCancelContentTouches = false 

Viel Glück!

+0

Anstatt diese Information in einem Kommentar zu hinterlassen, editieren Sie Ihre Antwort und fügen Sie sie direkt dort hinzu. Löschen Sie dann den Kommentar. Sie können auch die Möglichkeit nutzen, den Einzug zu korrigieren (die Codeformatierung mit Markdown erfordert 4 Leerzeichen, aber Sie haben 8, was zu einem unnötigen zusätzlichen Einzug führt). Vielen Dank! –