使用invalidateLayout调用的高级UICollectionView动画

UICollectionView编程指南说:

除了动画化插入,删除和移动操作之外,您可以随时使布局无效并强制重绘其内容。 使布局失效不会直接动画项目; 当您使布局无效时,集合视图会在不计算动画的情况下在新计算的位置显示项目。 但是,使布局无效的行为会导致布局对象显式移动项目。 在自定义布局中,您可以使用此行为来定期定位单元格并创建动画效果。

我一直在尝试这样的事情,其中AnimationStep是我的UICollectionViewFlowLayout子类使用的枚举,用三阶段动画有条件地设置UICollectionViewFlowLayout的位置:

-(void)update{
    [self animateLayoutAfterDelay:2.0 toStep:AnimationStepOne];
    [self animateLayoutAfterDelay:4.0 toStep:AnimationStepTwo];
    [self animateLayoutAfterDelay:6.0 toStep:AnimationStepThree];
}

-(void)animateLayoutAfterDelay:(NSTimeInterval)delay toStep:(MagazineLayoutAnimationStep)step {
    double delayInSeconds = delay;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [UIView animateWithDuration:2.0 animations:^{
            self.layout.animationStep = step;
            [self.layout invalidateLayout];
        }];
    });
}

这具有相当不可预测的影响。 有些单元格会按照我所期望的方式生成动画,有些单元格会隐藏起来并显示出来,或者出现在新的位置。 我在单元格上放置了随机背景颜色,看看这可能是UICollectionView回收单元格的效果,当然这是有的。 这解释了一些怪诞,但不是全部。

有人知道苹果如何让我使细胞动画并移动它们吗?

(我需要这个,因为我的收藏视图单元格倾向于改变大小,我想要一个没有任何对角线移动的优美动画)。


答案是使用中间布局。

[self.collectionView setCollectionViewLayout: layoutForStepOne animated:YES completion:^(BOOL finished) {
    [self.collectionView setCollectionViewLayout: layoutForStepTwo animated:YES completion:^(BOOL finished) {
        [self.collectionView setCollectionViewLayout: layoutForStepThree animated:YES];

    }];
}];

很简单:

创建一些UICollectionViewLayout的新实例并使用

- (void)setCollectionViewLayout:(UICollectionViewLayout *)layout animated:(BOOL)animated

将UICollectionView上的布局设置为此新布局对象。 确保您使用YES作为动画参数。

编辑:为了做多舞台动画我会尝试

performBatchUpdates:completion:

并将下一个更新放入完成块并重复。

链接地址: http://www.djcxy.com/p/84159.html

上一篇: Advanced UICollectionView animation using invalidateLayout calls

下一篇: UICollectionView: Animate cell size change on selection