it-swarm.com.de

ScrollView-Gestenerkenner, der alle Berührungsereignisse aufnimmt

Ich habe ein UIScrollView, zu dem ich einen einzelnen Tippgestenerkenner hinzugefügt habe, um eine UI-Überlagerung anzuzeigen/auszublenden.

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

und:

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

Ich habe ein einfache Tabellenansicht am Ende des UIScrollView hinzugefügt. Alles funktioniert richtig (horizontal und vertikal scrollen), aber das Problem ist, dass das Tippen nur von der Gestenerkennung (oben) erkannt wird, nicht jedoch von der einfachen Tabellenansicht. Wenn ich die Zeile entferne, in der der Gesten-Listener registriert ist, funktioniert alles einwandfrei, und die Tabellenansicht merkt, dass sie auf sich selbst tippt.

Es ist, als ob die Gestenerkennungsfunktion die Tap-Ereignisse in der Tabellenansicht "frisst" und sie nicht nach unten überträgt.

Jede Hilfe wird geschätzt

39
Itai Hanski

Dies sollte Ihr Problem lösen.
Berührungsereignis auf UIScrollView UND auf UIView-Komponenten erkennen [die in UIScrollView platziert werden]
Die Idee ist, dem Gestenerkenner mitzuteilen, dass er die Berührungsereignisse nicht verschlucken soll. Dazu müssen Sie die cancelsTouchesInView -Eigenschaft 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]; 
76
zambrey

Swift 3.

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

Und die Auswahlmethode ist wie.

@objc func handleTap(_ recognizer: UITapGestureRecognizer) {
  // Perform operation
}
12
Jaydeep

Ich denke, der Grund ist, dass User Interaction Enabled ist für UIImageView auf false gesetzt. Sie sollten den Wert auf true setzen, um das Tippen darauf zu aktivieren

6
RandyTek

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

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

Vielen Dank @ Zambrey

Swift 2.2+ Version:

scrollView.delegate = self

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

scrollView.addGestureRecognizer(allowMultipleTouches)

Wenn sich Ihre Bildlaufansicht im Storyboard befindet, vergessen Sie nicht, das Outlet im View-Controller zu fixieren. In diesem Beispiel ist scrollView der Ausgang des UIScrollView.

2
Nuno Vieira

Dies funktionierte 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!

2
hamishkeith

Sie können jede Art von Gesten in der UIscrollView erfassen. Stellen Sie sicher, dass Sie auch einige der Standardeigenschaften verarbeiten und die Eigenschaft cancelsTouchesInView auf false setzen. Dies ist standardmäßig true. Geben Sie Ihren Unteransichten auch einige Tag-Nummern, um sie in Selektoren zu unterscheiden. & Aktivieren Sie auch die Benutzerinteraktion auf true.

let tap = UITapGestureRecognizer (Ziel: Selbst, Aktion:

selektor (didTapByUser (_ :)))

1
Aks

TapGestures hat bei mir funktioniert. Beim Wischen musste ich das Scrollen deaktivieren und es funktionierte.

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
1
Maria