DidSelectItemAtIndexPath может использоваться в качестве триггера, но в остальном здесь не имеет значения.
Если бы я попытался воспроизвести это, я бы выбрал следующий подход:
Во-первых, воздействуют на все ячейки в представлении коллекции, извлекают массив видимых элементов и применяют преобразование к каждому.
Преобразование выглядит так, как будто оно происходит в 2 этапа: сначала преобразование вращения по оси Y со значением, применяемым к матрице преобразования в .m34 для изменения перспективы. Во-вторых, преобразование перевода с отрицательным значением x, достаточно большим, чтобы переместить ячейку за пределы экрана. Поместите эти преобразования в группу базовой анимации, и я подозреваю, что вы будете очень близки к желаемому эффекту.
Последнее наблюдение заключается в том, что это похоже на переход, поэтому вы, вероятно, можете добиться этого как часть UIViewControllerAnimation.
ИЗМЕНИТЬ
Сегодня утром у меня было немного времени, поэтому я собрал для вас код.
Присмотревшись к анимации, я заметил, что движение влево на самом деле было частью анимации вращения с точкой привязки, установленной на 0 по оси x. Таким образом, все, что нам нужно, это анимация вращения и затухания — все центрируется на x = 0.
Чтобы добиться этого, самый простой подход — добавить CALayer для каждой из ячеек в списке коллекции и анимировать добавленный слой, как только ячейка будет «привита» к новому слою.
- (void)processVisibleItems{
NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems];
for (NSIndexPath *p in visibleItems) {
// create a layer which will contain the cell for each of the visibleItems
CALayer *containerLayer = [CALayer layer];
containerLayer.frame = self.collectionView.layer.bounds;
containerLayer.backgroundColor = [UIColor clearColor].CGColor;
// we need to change the anchor point which will offset the layer - adjust accordingly
CGRect containerFrame = containerLayer.frame;
containerFrame.origin.x -= containerLayer.frame.size.width/2;
containerLayer.frame = containerFrame;
containerLayer.anchorPoint = CGPointMake(0.0f, 0.5f);
[self.collectionView.layer addSublayer:containerLayer];
//add the cell to the new layer - change MyCollectionViewCell to your cell's class
MyCollectionViewCell *cell = (MyCollectionViewCell*)[self.collectionView cellForItemAtIndexPath:p];
cell.frame = [containerLayer convertRect:cell.frame fromLayer:cell.superview.layer];
[containerLayer addSublayer:cell.layer];
//add the animation to the layer
[self addAnimationForLayer:containerLayer];
}
}
- (void)addAnimationForLayer:(CALayer*)layerToAnimate{
// fade-out animation
CABasicAnimation *fadeOutAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
[fadeOutAnimation setToValue:@0.0];
//rotation Animation
CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
CATransform3D tfm = CATransform3DMakeRotation((65.0f * M_PI) / 180.0f, 0.0f, -1.0f, 0.0f);
//add perspective - change to your liking
tfm.m14 = -0.002f;
rotationAnimation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
rotationAnimation.toValue = [NSValue valueWithCATransform3D:tfm];
//group the animations and add to the new layer
CAAnimationGroup *group = [CAAnimationGroup animation];
group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
group.fillMode = kCAFillModeForwards;
group.removedOnCompletion = NO;
group.duration = 0.35f;
[group setAnimations:@[rotationAnimation, fadeOutAnimation]];
[layerToAnimate addAnimation:group forKey:@"rotateAndFadeAnimation"];
}
//To trigger on cell click simply call [self processVisibleItems] in didSelectItemAtIndexPath
NB -
Есть несколько вещей, которые вам нужно изменить, чтобы это выглядело точно так же, как анимация в вашем видео:
- Рандомизируйте массив, содержащий список видимых элементов. Как бы то ни было, элементы будут срабатывать последовательно или в соответствии с массивом видимых элементов.
- Рандомизируйте продолжительность анимации группы или, как минимум, введите небольшую задержку между анимациями (рандомизация продолжительности от 0,35 (время по умолчанию Apple) до, скажем, 0,6 должно работать хорошо).
- Возможно, рандомизируйте угол анимации вращения - должно работать что-то между, скажем, 50 и 85 градусами (в настоящее время установлено значение 65 в приведенном выше примере);
Вот и все... Наслаждайтесь!
person
MDB983
schedule
29.03.2016