Domanda

Su qualsiasi 2014+ iPhone o iPad, fare doppio clic sul pulsante Home per vedere "App Manager"

Inserisci Descrizione dell'immagine qui

Questo è un uicolectionView a sinistra a destra ma ha un gesto "swipe-away" .. Scorri verso l'alto.Com'è fatto?Non è così facile "rimuovere" una cella da un uicollectionView.


.

Nota per Googlers .. Per il problema generale di "peeling", "strappando via", una cella da una vista di raccolta, ecco una spiegazione completa in ordine: Https://stackoverflow.com/a/24339705/294884 Spero che aiuti qualcuno.

È stato utile?

Soluzione

Può essere molto più semplice dei commenti sulla tua domanda suggerendo.

La tua cella dovrebbe contenere una vista (la cosa che stai per trascinarti) e aggiungi un uipanserrecognizer a quella vista.

Nel metodo di azione del Gesto, si sposta la vista su o giù, e quando si ottiene abbastanza lontano che si desidera eliminarlo, lo stai solo animando. Ci sono molte domande qui che si occupano di questa parte.

Questo lascia un gap nella tua collezione e ora hai bisogno di spostare le cose in giro. Si scopre che è abbastanza semplice:

[_collectionView performBatchUpdates:^{
   [_collectionView deleteItemsAtIndexPaths:@[indexPath]];
} completion:^(BOOL finished) {
     // you might want to remove the data from the data source here so the view doesn't come back to life when the collection view is reloaded.
}];
.

La roba a destra delle diapositive di cellule rimosse e siamo tutti buoni.

Un altro problema per superare: assicurandosi che il tuo riconoscimento dei gesti e la visualizzazione della raccolta Per fortuna, non è troppo complicato.

[_collectionView.panGestureRecognizer requireGestureRecognizerToFail:pgr]; //where pgr is the recognizer you made for dragging the view off
.

Ciò significa affinché il gesto della veduta della raccolta faccia la sua cosa, il tuo deve fallire. Quindi vorrai impostare il tuo in modo che funzioni solo durante il panning su e giù, e lascia che la vista della collezione faccia ancora la sua cosa per le pentole sinistra a destra. Nel delegato dei tuoi riconoscimenti dei gesti, implementare il seguente metodo che controlla semplicemente se ti sposta di più sull'asse X o sull'asse Y.

-(BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer
{
    CGPoint translation =[gestureRecognizer translationInView:self.view];

    return(translation.x * translation.x > translation.y * translation.y);
}
.

Altri suggerimenti

Stavo cercando questa funzionalità e usando il suggerimento @mbehan che ho scelto questa funzionalità usando UicollectionView.

Quello che ho fatto è aggiunto una vista di dimensioni più piccole su una cella di raccolta (sfondo trasparente) e ha aggiunto un singolo gesto di padella su CollectionView (non su ciascuna cella), quindi su Gesture Pan, sposta la vista e sembra la cellasi sta muovendo.After View raggiunge un certo punto, lo nascondo prima e quindi elimina la cella di vista della raccolta.

Gerarchia cellulare: Collectionviewcell -> Visualizza (Tag Value== 2) -> Uilabel (valore tag== 1) L'etichetta è appena utilizzata per lo scopo del segnaposto.

Sto postando il mio codice qui sotto:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = (UICollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Cards" forIndexPath:indexPath];
    UILabel *lblNumber = (UILabel*)[cell.contentView viewWithTag:1];
    UIView *viewTouch = (UIView*)[cell.contentView viewWithTag:2];
    [viewTouch setHidden:NO];
    [lblNumber setText:arrCards[indexPath.row]];

    return cell;
}


- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    return UIEdgeInsetsMake(0, 50, 0, 30);
  }

-(BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer
{

    if([gestureRecognizer isEqual:panGesture]) {
    CGPoint point = [(UIPanGestureRecognizer*)gestureRecognizer translationInView:collectionView_];
        if(point.x != 0) { //adjust this condition if you want some leniency on the X axis
        //The translation was on the X axis, i.e. right/left,
        //so this gesture recognizer shouldn't do anything about it
        return NO;
        }
   }
   return YES;
}

- (IBAction)panGestureCalled:(UIPanGestureRecognizer *)sender {
    yFromCenter = [sender translationInView:collectionView_].y; //%%% positive for up, negative for down

    UIView *view = sender.view;
    CGPoint location = [view.superview convertPoint:view.center toView:collectionView_];
    NSIndexPath *indexPath = [collectionView_ indexPathForItemAtPoint:location];
    UICollectionViewCell *cell = [collectionView_ cellForItemAtIndexPath:indexPath];
    UIView *touchView = (UIView*)[cell.contentView viewWithTag:2];


    switch (sender.state) {
      case UIGestureRecognizerStateBegan:{
        originalPoint = touchView.center;
        break;
    };
      case UIGestureRecognizerStateChanged:{
        touchView.center = CGPointMake(originalPoint.x , originalPoint.y + yFromCenter);

        break;
    };
        //%%% let go of the card
      case UIGestureRecognizerStateEnded: {
        CGFloat velocityY = (0.2*[(UIPanGestureRecognizer*)sender velocityInView:collectionView_].y);

        if (velocityY < -30 && yFromCenter<0) {
            [self hideView:touchView withDuration:0.2 andIndexPath:indexPath];

        }else if ((yFromCenter< 0 && yFromCenter > -200) || yFromCenter > 0){

            CGFloat animationDuration = (ABS(velocityY)*.0002)+.2;
            [self resettleViewToOriginalPosition:touchView andDuration:animationDuration];

        }else
            [self hideView:touchView withDuration:0.2 andIndexPath:indexPath];

    };
        break;
      case UIGestureRecognizerStatePossible:break;
      case UIGestureRecognizerStateCancelled:break;
      case UIGestureRecognizerStateFailed:break;
  }
}


-(void)resettleViewToOriginalPosition:(UIView*)view andDuration:(float)duration{
[UIView animateWithDuration:duration
                      delay:0.0f
                    options: UIViewAnimationOptionCurveEaseOut
                 animations:^
 {
     [view setCenter:originalPoint];
 }
                 completion:^(BOOL finished)
 {

 }];
}
- (void)hideView:(UIView*)view withDuration:(float)duration andIndexPath:(NSIndexPath*)indexPath
{

[UIView animateWithDuration:duration
                      delay:0.0f
                    options: UIViewAnimationOptionCurveEaseOut
                 animations:^
 {
     CGRect frame = view.frame;
     frame.origin.y = -300;
     view.frame = frame;
 }
                 completion:^(BOOL finished)
 {
     [view setHidden:YES];
     CGRect frame = view.frame;
     frame.origin.y = 39;
     view.frame = frame;
     NSLog(@"View is hidden.");

     [arrCards removeObjectAtIndex:indexPath.row];
     [collectionView_ performBatchUpdates:^{
         [collectionView_ deleteItemsAtIndexPaths:@[indexPath]];
     } completion:^(BOOL finished) {
         // you might want to remove the data from the data source here so the view doesn't come back to life when the collection view is reloaded.
     }];
 }];
}
.

e mantenere il pagante di raccolta della raccolta di non e poi dovrebbe essere buono per andare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top