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?
InformationsquelleAutor Cindeselia | 2014-05-21
Schreibe einen Kommentar