我说的是insertItemsAtIndexPaths
or之类的东西moveItemAtIndexPath:toIndexPath:
。我曾尝试将其包装在动画块中,但这不起作用。动画似乎停留在 0.25 或 0.3 秒,但我想放慢速度。除了自己实现这个不值得麻烦的运动之外,有谁知道这是否可以通过公共 API 实现?
2 回答
绝对地!但是你不能使用UIView
动画块正确地做到这一点。您需要深入研究核心动画。
集合视图有助于将动画添加到CALayer
支持每个UICollectionViewCell
. 但是,如果您实现自己的布局(或子类化现有布局),您可以在finalizeCollectionViewUpdates
方法中对这些动画进行所有必要的修改。
从UICollectionViewLayout
类文档中:
集合视图调用此方法作为之前的最后一步,以动画任何更改到位。
以下是如何用您自己的替换默认位置动画的示例:
- (void)finalizeCollectionViewUpdates
{
for (UICollectionViewCell *cell in [self.collectionView visibleCells])
{
CAAnimation *positionAnimation = [cell.layer animationForKey:@"position"];
if (positionAnimation)
{
[cell.layer removeAnimationForKey:@"position"];
CALayer *presentationLayer = cell.layer.presentationLayer;
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setFromValue:[NSValue valueWithCGPoint:presentationLayer.position]];
[animation setToValue:[NSValue valueWithCGPoint:cell.layer.position]];
[animation setDuration:0.4];
[cell.layer addAnimation:animation forKey:@"position"];
}
}
}
查看与动画相关的方法CALayer
,了解如何深入了解图层上当前正在运行的动画。
使用这种方法,您甚至可以发挥创意并使用CAKeyframeAnimation
或您能想到的任何其他方式添加过冲/反弹效果。您还可以做一些事情,例如选择性地禁用某些动画(如大小)并保留其他动画(如位置)。
从这里复制过来:https ://stackoverflow.com/a/18392148/1751266
您可以使用 CALayer 更改任何动画速度。所以对于 UICollectionView 这看起来像下面这样:
[self.collectionView.viewForBaselineLayout.layer setSpeed:0.1f];
你可以改回原来的速度:
[self.collectionView.viewForBaselineLayout.layer setSpeed:1.0f];
为此,您可能需要导入 QuartzCore:
#import <QuartzCore/QuartzCore.h>
请记住,它会影响同一层上的任何其他动画,包括动画 UIImageView 等,因此它们可能需要补偿。