How to pass-pan-Geste UICollectionVIew von UICollectionViewCell?
Ich habe eine UICollectionView
Implementierung eines grid-basierten Layouts von benutzerdefinierten UICollectionViewCells
. Zu erlauben, Zellen zu reagieren, zu ziehen, die ich einzeln hinzufügen UIPanGestureRecognizer
zu jeder Zelle.
Den UICollectionView
noch Schriftrollen (horizontal), wenn ich touch down und wischen Sie nach Links/rechts beginnend an den Punkten zwischen den Zellen, aber so lange, wie die pan-gestik-Erkennung Hinzugefügt wird, um eine Zelle, wie es scheint, die CollectionView
weigert sich zu scrollen, wenn ich mein swipe-Tippen in eine Zelle.
Gerade jetzt, ich getrennte horizontale Links/rechts zieht von der vertikalen nach oben/nach unten zieht, so sollte es keine Konflikte zwischen ziehen Zellen aus (vertikale Bewegungen) und das scrollen über die CollectionView
(Horizontale Bewegungen). In diesem Fall ist, wie kann ich pass das streichen der Sammlung/scroll-Ansicht, damit Sie weiß, um zu Blättern, wie die normalen? Es ist wirklich ärgerlich zu haben, um zu beginnen auf der Grenze oder Abstand zwischen den Zellen.
Nachdem ich entfernen Sie die pan-Geste aus einer Zelle, das scrollen funktioniert ganz normal egal ob ich starte durch "wischen" auf eine Zelle oder zwischen den Zellen.
BEARBEITEN:Gewünschte pan-Geste Verhalten unten geschrieben als aktuellen code
//Handle pans by detecting swipes:
-(void) handlePan:(UIPanGestureRecognizer*)recognizer
{
//Calculate touch location
CGPoint touchXY = [recognizer locationInView:masterWindowView];
//Handle touch
if (recognizer.state == UIGestureRecognizerStateBegan)
{
gestureWasHandled = NO;
pointCount = 1;
startPoint = touchXY;
}
if (recognizer.state == UIGestureRecognizerStateChanged)
{
++pointCount;
//Calculate whether a swipe has occurred
float dX = deltaX(touchXY, startPoint);
float dY = deltaY(touchXY, startPoint);
BOOL finished = YES;
if ((dX > kSwipeDragMin) && (ABS(dY) < kDragLimitMax)) {
touchType = TouchSwipeLeft;
NSLog(@"LEFT swipe detected");
[recognizer requireGestureRecognizerToFail:recognizer];
//[masterScrollView handlePan]
}
else if ((dX < -kSwipeDragMin) && (ABS(dY) < kDragLimitMax)) {
touchType = TouchSwipeRight;
NSLog(@"RIGHT swipe detected");
[recognizer requireGestureRecognizerToFail:recognizer];
}
else if ((dY > kSwipeDragMin) && (ABS(dX) < kDragLimitMax)) {
touchType = TouchSwipeUp;
NSLog(@"UP swipe detected");
}
else if ((dY < -kSwipeDragMin) && (ABS(dX) < kDragLimitMax)) {
touchType = TouchSwipeDown;
NSLog(@"DOWN swipe detected");
}
else
finished = NO;
//If unhandled and downward, produce a new draggable view
if (!gestureWasHandled && finished && (touchType == TouchSwipeDown))
{
[self.delegate cellBeingDragged:self];
dragView.center = touchXY;
dragView.hidden = NO;
dragView.backgroundColor = [UIColor clearColor];
masterScrollView.scrollEnabled = NO; //prevent user from scrolling during
gestureWasHandled = YES;
}
else if (gestureWasHandled)
{
//allow continued dragging after detection
dragView.center = touchXY;
}
}
if (recognizer.state == UIGestureRecognizerStateEnded)
{
//ensure that scroll view returns to scrollable
if (gestureWasHandled) {
[self.delegate cell:self dragEndedAt:touchXY];
}
}
}
//Allow simultaneous recognition
-(BOOL) gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer
{
return YES;
}
Dieser code funktioniert, wenn Sie an jede einzelne Zelle. Es funktioniert NICHT, wenn Sie an das UICollectionView, wie seine gestik-Erkennung, und es ist in der Tat nicht mehr alle scrollen.
- Wo ist der code? Ihre gestik-Erkennung code sollte Leben in Ihrer view-controller. Die Methode
gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer
ermöglicht zwei verschiedene gesten gleichzeitig laufen lassen, nicht eine Bewegung erkannt wird, indem zwei verschiedene Ansichten - ist es das, was Sie beabsichtigen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statt der Anbringung einer
UIPanGestureRecognizer
für jede Zelle (die Leistung verringern) fügen Sie einUIPanGestureRecognizer
zu denUICollectionView
und wenn der pan-Geste geschieht, verwendenlocationInView
auf den Punkt in derUICollectionView
wo der pan begann, und dannindexPathForItemAtPoint
, die zurückkehren wird Sie die index-Pfad für die Zelle, die Sie sollten zu animieren.Diese Weise müssen Sie nur eine gestik-Erkennung (gute!) für Ihre ganze Sammlung anzeigen, während auch die Aufrechterhaltung der Kontrolle in Ihrer view-controller (wie Sie wollte) - Doppel gewinnen!
Mit dieser Lösung, die in Ihrer view-controller, die Sie umsetzen würden gestureRecognizer:shouldReceiveTouch:, greifen die angegebenen gestureRecognizer, stellen Sie sicher, dass es Ihr
UIPanGestureRecognizer
und seinetranslationInView:
Methode, um herauszufinden, ob die übersetzung auf der X-oder Y-Achse. Verwenden Sie diese Informationen, um zu entscheiden, ob Sie zurückkehren möchten, JA oder NEIN. Zum Beispiel:UIGestureRecognizerDelegate
- Protokoll (insbesondere diegestureRecognizer:shouldReceiveTouch:
), um zu entscheiden, ob eine Zelle erhalten, sollte die Geste oder nicht.Dass die -shouldReceiveTouch: und -shouldRecognizeSimultaneouslyWithgesturerecognizer: Rückkehr JA, fügen Sie UIGestureRecognizerDelegate Ihrer Klasse Protokoll-Liste und delegieren Ihre gesten zu delegieren, um selbst in -viewDidLoad.