7

Я хотел бы оживить перезагрузку коллекции, так что, когда ячейка выбрана, я получаю анимацию, похожую на раздачу карт в игре с пасьянсом. (Воображение старых пасьянсов карты MS дело)Пользовательская анимация на перезагрузке данных UICollectionView

Я искал вокруг для «обычая UICollectionView перезарядить animatation» и видел такие решения, как

[self.collectionView performBatchUpdates:^{ 
[self.collectionView reloadItemsAtIndexPaths:myindexPaths] 
} completion:nil]; 

и выдумал этот

CATransition *transition = [CATransition animation]; 
    transition.duration = 1; 
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    transition.type = kCATransitionMoveIn; 
    [self.collectionView.layer addAnimation:transition forKey:nil]; 
    [self.collectionView reloadData]; 
    return; 

Но не получает желаемого эффекта. Любые идеи, как это можно сделать?

+1

Для достижения этой цели вы должны создать подкласс 'UICollectionViewLayout'. Никакой другой вариант. – itsji10dra

ответ

1

Вам необходимо создать пользовательский UICollectionViewLayout, который сделает вашу пользовательскую анимацию. Если эффект - это просто перевод из точки A в точку B, вы можете использовать его, используя довольно стандартное использование встроенных анимаций. Вы должны установить местоположение ячейки в точке A в initialLayoutAttributesForAppearingItemAtIndexPath: и на точку B в layoutAttributesForItemAtIndexPath:. Когда вы хотите иметь дело с картами, вы просто вставляете соответствующие пути индекса в представление коллекции с помощью performBatchUpdates:. Аналогичная анимация для отправки карт дилеру должна использоваться finalLayoutAttributesForDisappearingItemAtIndexPath:.

Если вы хотите сделать более сложную анимацию, у вас будет гораздо больше работы на ваших руках. Это, скорее всего, будет включать моментальный снимок ячейки и преобразование ее перед анимацией вдоль CGPath. После того, как анимация будет выполнена, вы затем скажете коллекцию, чтобы нарисовать ее в своем конечном месте.

3

и может сделать какой-то трюк, как предложил here

+ (CATransition *)swipeTransitionToLeftSide:(BOOL)leftSide 
{ 
    CATransition* transition = [CATransition animation]; 
    transition.startProgress = 0; 
    transition.endProgress = 1.0; 
    transition.type = kCATransitionPush; 

    transition.subtype = leftSide ? kCATransitionFromRight : kCATransitionFromLeft; 
    transition.duration = AnimationDuration; 
    return transition; 
} 

и добавить его в collectionView

UISwipeGestureRecognizer *swipeGestureL = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipeToLeftCollectionView:)]; 
swipeGestureL.direction = UISwipeGestureRecognizerDirectionLeft; 
[self.collectionView addGestureRecognizer:swipeGestureL]; 

- (void)didSwipeToLeftCollectionView:(UISwipeGestureRecognizer *)swipeGesture 
{ 
    [self.collectionView.layer addAnimation:[Animation swipeTransitionToLeftSide:YES] forKey:nil]; 
    [self.collectionView reloadData]; 
} 

результат:

enter image description here

0

мне нравится @ ответ GBK, с тем здесь он находится в Swift 3,1 для левой и правой

override func viewDidLoad() { 
    super.viewDidLoad() 

    let swipeGestureL = UISwipeGestureRecognizer(target: self, action: #selector(swipeLeft)) 
    swipeGestureL.direction = .left 
    collectionView.addGestureRecognizer(swipeGestureL) 

    let swipeGestureR = UISwipeGestureRecognizer(target: self, action: #selector(swipeRight)) 
    swipeGestureR.direction = .right 
    collectionView.addGestureRecognizer(swipeGestureR) 
} 

func swipeTransitionToLeftSide(_ leftSide: Bool) -> CATransition { 
    let transition = CATransition() 
    transition.startProgress = 0.0 
    transition.endProgress = 1.0 
    transition.type = kCATransitionPush 
    transition.subtype = leftSide ? kCATransitionFromRight : kCATransitionFromLeft 
    transition.duration = 0.3 

    return transition 
} 

@IBAction func swipeLeft() { 
    collectionView.layer.add(swipeTransitionToLeftSide(true), forKey: nil) 
    updateDasource() 
} 

@IBAction func swipeRight() { 
    collectionView.layer.add(swipeTransitionToLeftSide(false), forKey: nil) 
    updateDatasource() 
} 

func updateDatasource() { 
    self.collectionView.reloadData() 
} 
Смежные вопросы