有没有办法改变 UICollectionView 的动画速度?

Posted

技术标签:

【中文标题】有没有办法改变 UICollectionView 的动画速度?【英文标题】:Is there a way to change the speed of the animations for UICollectionViews? 【发布时间】:2012-09-22 20:43:59 【问题描述】:

我说的是insertItemsAtIndexPathsmoveItemAtIndexPath:toIndexPath: 之类的东西。我曾尝试将其包装在动画块中,但这不起作用。动画似乎停留在 0.25 或 0.3 秒,但我想放慢速度。除了自己实现这个不值得麻烦的动作之外,有谁知道这是否可以通过公共 API 实现?

【问题讨论】:

【参考方案1】:

绝对!但是你不能使用UIView 动画块正确地做到这一点。您需要深入研究 Core Animation。

集合视图有助于将动画添加到支持每个UICollectionViewCellCALayer。但是,如果您实现自己的布局(或子类化现有布局),您可以在 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 或您能想到的任何其他方式添加超调/反弹效果。您还可以执行一些操作,例如选择性地禁用某些动画(如大小)并保留其他动画(如位置)。

【讨论】:

【参考方案2】:

从这里复制过来:https://***.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 等,因此它们可能需要补偿。

【讨论】:

以上是关于有没有办法改变 UICollectionView 的动画速度?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法自动滚动到UICollectionView的底部

有没有办法用内容偏移量初始化 UICollectionView?

有没有办法以编程方式向 UICollectionView 单元格添加填充?

在 UICollectionView 子类中实现 UIScrollViewDelegate

将 CKAsset 异步加载到 UICollectionView

UICollectionView 在特定部分开始