Horizontales Verschieben in UITableView erkennen
Ich bin mit einem UIPanGestureRecognizer zu erkennen, horizontal verschiebbar in einem UITableView (auf eine Zelle, um genau zu sein, aber es wird Hinzugefügt, um die Tabelle selbst). Jedoch, diese gestik-Erkennung natürlich Stiehlt das berührt vom Tisch. Ich hab schon den pangesturerecognizer zu erkennen, horizontal schieben und dann einrasten; aber wenn der Benutzer beginnt, durch verschieben der vertikalen, sollte es passieren alle Ereignisse aus, berühren Sie, um die tableview.
Eine Sache, die ich versucht habe, war das deaktivieren der Erkennung, aber dann würde es nicht scrollen, bis die nächste touch-event. Also ich bräuchte es zum bestehen der Veranstaltung sofort dann.
Andere Sache, die ich versucht war, so dass es scroll mich, aber dann entgehen einem die beständige Geschwindigkeit nach absetzen der touch.
Heres einige code:
//In the viewdidload method
UIPanGestureRecognizer *slideRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(sliding:)];
[myTable addGestureRecognizer:slideRecognizer];
-(void)sliding:(UIPanGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateBegan)
{
CGPoint translation = [recognizer translationInView:favoritesTable];
if (sqrt(translation.x*translation.x)/sqrt(translation.y*translation.y)>1) {
horizontalScrolling = YES; //BOOL declared in the header file
NSLog(@"horizontal");
//And some code to determine what cell is being scrolled:
CGPoint slideLocation = [recognizer locationInView:myTable];
slidingCell = [myTable indexPathForRowAtPoint:slideLocation];
if (slidingCell.row == 0) {
slidingCell = nil;
}
}
else
{
NSLog(@"cancel");
}
if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled)
{
horizontalScrolling = NO;
}
if (horizontalScrolling)
{
//Perform some code
}
else
{
//Maybe pass the touch from here; It's panning vertically
}
}
Also, irgendwelche Tipps, gewusst wie: übergeben Sie das berührt?
Zusatz: ich dachte auch, vielleicht Unterklasse der tableview - gesture recognizer-Methode, zuerst prüfen, ob es horizontal, Aber dann bräuchte ich die original-code, nehme ich an... Keine Ahnung, ob Apple Probleme haben wird.
Auch: ich habe keine Unterklasse der UITableView(controller), nur die Zellen. Dieser code ist in der viewcontroller enthält die Tabelle 😉
InformationsquelleAutor der Frage Erik S | 2011-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche Problem und kam mit einer Lösung, die mit der UIPanGestureRecognizer.
Im Gegensatz zu Erik, die ich Hinzugefügt habe der UIPanGestureRecognizer der Zelle direkt, da brauche ich nur eine Zelle auf einmal zur Unterstützung der Pfanne. Aber ich denke, dies sollte die Arbeit für Erik ' s Fall sowie.
Hier ist der code.
Für die Berechnung der horizontalen Geste kopierte Formular aus Erik ' s code – ich habe getestet dieses mit iOS 4.3.
Edit:
Ich habe herausgefunden, dass diese Implementierung verhindert, dass die "swipe-to-delete" - Geste. Um wieder das Verhalten, das ich Hinzugefügt haben, überprüfen Sie für die Geschwindigkeit der Geste der if-Anweisung oben.
Nach dem spielen ein bisschen auf mein Gerät kam ich mit einer Geschwindigkeit von 500 bis 600, die bietet meiner Meinung nach die beste user experience für den übergang zwischen der Pfanne und dem swipe-to-delete-Geste.
InformationsquelleAutor der Antwort Florian Mielke
Meine Antwort ist die gleiche wie Florian Mielke s, aber ich habe vereinfacht und korrigiert es einige.
Wie zu verwenden:
Geben Sie einfach Ihre
UIPanGestureRecognizer
Delegierter (UIGestureRecognizerDelegate
). Zum Beispiel:Dann haben, delegieren Sie die folgende Methode implementieren:
InformationsquelleAutor der Antwort Thane Brimhall
Können Sie versuchen, mithilfe der touch-Ereignisse manuell statt der Geste Merkmale. Immer vorbei an der Veranstaltung zurück zum tableview, außer wenn Sie schließlich erkennen die swipe-Geste.
Jede Klasse erbt von UIResponder haben die vier touch-Funktionen (begonnen, beendet, abgebrochen und verschoben). So ist der einfachste Weg, um "vorwärts" einen Aufruf zu handhaben es in Ihrer Klasse, und rufen Sie dann explizit auf das nächste Objekt, dass Sie möchten, zu umgehen (sollte man aber stellen Sie sicher, zu prüfen, ob das Objekt reagiert auf die Nachricht zunächst mit respondsToSelector: da es sich um eine optionale Funktion ). Auf diese Weise können Sie erkennen, was Ereignisse, die Sie wollen, und ermöglichen auch die normalen touch-Interaktion mit was auch immer andere Elemente, die es brauchen.
InformationsquelleAutor der Antwort drewag
Vielleicht können Sie die
UISwipeGestureRecognizer
statt? Man kann sagen, es zu ignorieren, up/down-Eingaben über diedirection
Eigenschaft.InformationsquelleAutor der Antwort Kobski
Danke für die Tipps! Ich ging schließlich für ein UITableView eine Unterklasse, wo ich prüfe, ob die Bewegung ist horizontal (in dem Fall ich mit meinem custom-Verhalten), und sonst rufen Sie [super touchesMoved: withEvent:];.
Aber ich weiß noch nicht wirklich, warum das funktioniert. Ich überprüfte, und super ist eine UITableView. Es scheint, ich noch nicht ganz verstanden, wie die Hierarchie funktioniert. Kann mir jemand versuchen zu erklären?
InformationsquelleAutor der Antwort Erik S