使用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