UICollectionView Programming Guide说:
除了动画插入,删除和移动操作外, 你可以随时使布局无效并强制它重绘它 内容。使布局无效不会直接为项目设置动画; 当您使布局无效时,集合视图将显示这些项目 在他们新计算的位置没有动画。然而 使布局无效的行为导致布局对象移动项目 明确。在自定义布局中,您可以使用此行为 定期定位单元格并创建动画效果。
我一直在尝试这样的事情,其中AnimationStep
是我的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回收细胞的影响,果然,有时它是。这解释了一些奇怪的东西,但不是全部。
有人知道Apple是如何让我为细胞设置动画并移动它们的吗?
(我需要这个,因为我的集合视图单元格会改变大小,我想要一个没有任何对角线移动的优美动画。)
答案 0 :(得分:8)
答案是使用中间布局。
[self.collectionView setCollectionViewLayout: layoutForStepOne animated:YES completion:^(BOOL finished) {
[self.collectionView setCollectionViewLayout: layoutForStepTwo animated:YES completion:^(BOOL finished) {
[self.collectionView setCollectionViewLayout: layoutForStepThree animated:YES];
}];
}];
答案 1 :(得分:0)
很简单:
创建一些UICollectionViewLayout的新实例并使用
- (void)setCollectionViewLayout:(UICollectionViewLayout *)layout animated:(BOOL)animated
将UICollectionView上的布局设置为此新布局对象。确保对动画参数使用YES。
编辑: 为了做多阶段动画,我会尝试
performBatchUpdates:completion:
并将下一个更新放入完成块并重复。