自定义animation从一个UICollectionViewLayout切换到另一个?
作为一个testing,我做了一个布局,以垂直线显示单元格,另一个以水平布局显示单元格。 当我调用[collectionView setCollectionViewLayout:layout animated:YES];
它在两个位置之间非常干净地animation。
现在我想要做的是在最终到达目的地之前,所有的视图都进行了一些旋转,扭曲和旋转(可能使用CAKeyframeAnimations),但是我找不到一个合适的位置来吸引它。
我尝试了UICollectionViewLayoutAttributes
包含一个animation属性,然后设置这些animation重写我使用的UICollectionViewCell
applyLayoutAttributes:
方法。 这工作…除了布局过渡完成后才出现。 如果我想使用这个,我必须有布局不改变对象的当前位置,只有在它达到这个应用属性代码的一部分,这似乎很多工作… … –
或者,我可以UICollectionView
并覆盖setCollectionViewLayout:animated:
UICollectionView
但是这也看起来像是很多状态来保持布局之间。 这两种select都不是正确的,因为有一种简单的方法可以在布局中增加/删除单元格。 我觉得应该有一些类似的布局之间的animation挂钩。
有谁知道最好的方法来获得我期望完成的?
#define degreesToRadians(x) (M_PI * (x) / 180.0) UICollectionView *collectionView = self.viewController.collectionView; HorizontalCollectionViewLayout *horizontalLayout = [HorizontalCollectionViewLayout new]; NSTimeInterval duration = 2; [collectionView.visibleCells enumerateObjectsUsingBlock:^(UICollectionViewCell *cell, NSUInteger index, BOOL *stop) { CABasicAnimation *rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; rotationAnimation.toValue = @(degreesToRadians(360)); rotationAnimation.duration = duration; rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; [cell.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; }]; [UIView animateWithDuration:duration animations:^ { collectionView.collectionViewLayout = horizontalLayout; }];