Comment passer pan geste à UICollectionVIew de UICollectionViewCell?
J'ai un UICollectionView
mise en œuvre d'une grille de mise en page personnalisée UICollectionViewCells
. Pour permettre aux cellules de répondre à de glisser, j'individuellement ajouter un UIPanGestureRecognizer
à chaque cellule.
La UICollectionView
défile toujours (à l'horizontale), quand je touche vers le bas et faites glisser vers la gauche/droite à partir à des points entre les cellules, mais aussi longtemps que le pan geste de reconnaissance est ajouté à une cellule, il semble que le CollectionView
refuse de défilement lorsque je démarre mon balayage appuyant dans une cellule.
Droit maintenant, j'séparés horizontalement de gauche à droite/à la traîne par rapport à la verticale vers le haut/vers le bas traîne, donc il ne devrait pas y avoir de conflit entre les faisant glisser sur les cellules verticale (frottis) et le défilement de la CollectionView
(Horizontal de glisse). Dans ce cas, comment puis-je passer le faites glisser vers la collection de défilement/affichage de sorte qu'il sait pour faire défiler comme normal? C'est vraiment ennuyeux d'avoir à commencer à la frontière ou l'espacement entre les cellules.
Une fois que j'ai retirer la casserole du geste à partir d'une cellule, le défilement travaille comme d'habitude, peu importe si je commencer à l'utiliser sur une cellule ou entre les cellules.
EDIT:Désiré pan geste comportement affiché en dessous comme le code actuel
//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;
}
Ce code fonctionne quand il est donné à chaque cellule individuelle. Il ne fonctionne PAS lorsqu'il est attaché à la UICollectionView que son geste de reconnaissance, et de fait, il s'arrête tout de défilement.
gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer
permet à deux différents gestes à exécuter en même temps, pas un geste à être reconnu par les deux points de vue différents - est-ce que vous l'intention?
OriginalL'auteur Cindeselia | 2014-05-21
Vous devez vous connecter pour publier un commentaire.
Au lieu d'attacher une
UIPanGestureRecognizer
à chaque cellule (qui va diminuer les performances) ajouter unUIPanGestureRecognizer
à laUICollectionView
et quand la poêle geste arrive utilisationlocationInView
de faire le point dans leUICollectionView
où le pan a commencé, et puisindexPathForItemAtPoint
qui va vous retourner le chemin d'index pour la cellule, vous devez animer.De cette façon, vous avez un seul geste de reconnaissance de la (bonne!) pour l'ensemble de votre collection de la vue tout en conservant le contrôle de votre vue-contrôleur (comme vous voulez) - double victoire!
À l'aide de cette solution, dans votre vue-contrôleur, vous pouvez implémenter les gestureRecognizer:shouldReceiveTouch:, prenez le gestureRecognizer, assurez-vous que votre
UIPanGestureRecognizer
et l'utilisation de sontranslationInView:
méthode pour savoir si la traduction est sur l'axe X ou Y. Utiliser cette information pour décider si vous souhaitez revenir OUI ou NON. Par exemple:Montrer un peu de code sur ce que vous avez essayé et comment vous avez mis en œuvre la solution que j'ai proposée. Je dois ajouter que vous doit avoir mis en œuvre la
UIGestureRecognizerDelegate
protocole (en particulier legestureRecognizer:shouldReceiveTouch:
) pour décider si une cellule doit recevoir le geste ou pas.En fait, oui, il serait utile de bien savoir le délégué des fonctions que je dois remplacer -- et s'écraser sur le ViewController, le UICollectionView, le UICollectionViewFlowLayout, ou le UICollectionViewCell. J'ai déjà écrasé handleGestureSimultaneously retourne toujours OUI. Vais poster le code ici dans un moment
Code posté! Merci!
Tout votre geste de reconnaissance méthodes devraient être dans votre vue-contrôleur, ou peut-être dans une classe personnalisée, mais pas dans votre point de vue ou la disposition de flux de sous-classe.
OriginalL'auteur KerrM
Avoir l'-shouldReceiveTouch: et -shouldRecognizeSimultaneouslyWithgesturerecognizer: de retour OUI, ajoutez UIGestureRecognizerDelegate que votre classe liste de protocole et de déléguer vos gestes délégué à soi -viewDidLoad.
Réponse la plus simple que j'ai pu trouver toute SORTE. Merci man!
OriginalL'auteur Amit Gupta