Ho un UICollectionView
che implementa un layout basato su griglia personalizzato UICollectionViewCells
. Per consentire alle celle di rispondere al trascinamento, aggiungo singolarmente uno UIPanGestureRecognizer
a ogni cella.Come passare il gesto di pan a UICollectionVIew da UICollectionViewCell?
I UICollectionView
scorre ancora (in orizzontale) quando tocco verso il basso e scorrere verso sinistra/destra a partire da punti tra le cellule, ma finché il gesto riconoscitore pentola viene aggiunto a una cella, sembra che la CollectionView
rifiuta di scorrere quando ho inizia il mio scorrimento toccando all'interno di una cella.
In questo momento, separo i trascinamenti orizzontale sinistro/destro dai trascinamento verticale verso l'alto/il basso, quindi non ci dovrebbero essere conflitti tra il trascinamento delle celle (scorrimento verticale) e lo scorrimento dello CollectionView
(scorrimento orizzontale). In questo caso, come posso passare lo scorrimento alla vista raccolta/scorrimento in modo che sappia scorrere normalmente? È davvero fastidioso dover iniziare sul confine o sulla spaziatura tra le celle.
Una volta rimosso il movimento di panoramica da una cella, lo scorrimento funziona normalmente, non importa se si inizia a scorrere su una cella o tra una cella e l'altra.
EDIT: desiderata comportamento gesto pan postato qui sotto come codice corrente
// 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;
}
Questo codice funziona quando somministrato ad ogni singola cella. NON funziona se collegato a UICollectionView come riconoscitore di gesti e in effetti interrompe lo scorrimento.
Dov'è questo codice? Il codice del tuo riconoscitore di gesti dovrebbe risiedere nel tuo controller di visualizzazione. Il metodo 'gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer' consente l'esecuzione simultanea di due diversi gesti, ** non ** un gesto per essere riconosciuti da due diversi punti di vista - è questo che intendi? – KerrM