Вопрос

На любом iPhone или iPad 2014+, дважды щелкните кнопку «Домой», чтобы увидеть «Manager App Manager»

Введите описание изображения здесь

Это левый правый UICOLLECKVIEW, но у него есть жест «промедления». Проведите пальцем вверх.Как это делается?Это не так легко «удалить» ячейку из UICOLLECKVIEW.


Сноска для Googleers .. Для общей проблемы «отслаиваться», «разрывая», одну клетку из коллекции, вот полное приборное объяснение: http://stackoverflow.com/a/24339705/294884 Надеюсь, это поможет кому-то.

Это было полезно?

Решение

Это может быть намного проще, чем предложены комментарии к вашему вопросу.

Ваша ячейка должна содержать представление (то, что вы собираетесь утащить), и вы добавляете UipangeStureVelectureCognizer к этому представлению.

В методе действий жеста вы перемещаете вид вверх или вниз, а когда он достаточно далеко от того, что вы хотите удалить его, вы просто анимируете. Здесь много вопросов, имеющих дело с этой частью.

Это оставляет зазор в вашей коллекции, и теперь вам нужно перемещать вещи. Оказывается, это довольно просто:

[_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.
}];
.

Весьма справа от удаленной ячейки скользит, и мы все хорошо.

Другая проблема, чтобы перейти: Убедитесь, что удерживание вашего жеста и коллекция просмотра, которую играет приятно вместе. К счастью, это тоже не слишком сложно.

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

Это значит для того, чтобы сбрасывать сбора пропасть, чтобы сделать его, ваша должна потерпеть неудачу. Таким образом, вы захотите настроить вас так, чтобы он работает только при проложении вверх и вниз, и пусть с коллекцией по-прежнему делает свою вещь для слева на правой кастрюли. В делегатах распознавателя вашего жеста реализуйте следующий метод, который просто проверяет, двигается ли вы больше на оси X или y-y.

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

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

Другие советы

Я искал эту функциональность и используя предложение @mbehan, я подделал эту функциональность, используя UICollectionView.

Что я сделал, я добавил мнение меньшего размера на ячейке коллекции (прозрачный фон) и добавил один жест панорамирования на CollectionView (не на каждой ячейке), затем на жестдвигается.После того, как просмотр достигает некоторого точка, я сначала скрыть его, а затем удаляет ячейку сбора коллекции.

Иерархия клеток: CollectionViewCell -> Просмотр (значение тега== 2) -> UILabel (значение тега== 1) Этикетка только используется для цели заполнителя.

Я размещаю свой код ниже:

- (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.
     }];
 }];
}
.

И держите Pengenabled сбора COUNT, и тогда должно быть хорошо, чтобы пойти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top