UICollectionView:自定义布局动画

6

我正在一个UICollectionView中展示许多图像单元格。我希望通过一个按钮将所有单元格分组到第一个单元格上。

这个功能已经可以正常工作,但是当我尝试为重新分组操作添加动画过渡时,什么也没有发生。

下面是我在自定义布局中使用的方法:

- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray* allAttributesInRect = [super layoutAttributesForElementsInRect:rect];

    if([allAttributesInRect count] > 0 && _isRegroup)
    {
        UICollectionViewLayoutAttributes *firstAttribute = [allAttributesInRect objectAtIndex:0];
        CGRect frame = firstAttribute.frame;

        for(UICollectionViewLayoutAttributes *attribute in allAttributesInRect)
            [UIView animateWithDuration:0.3f animations:^{attribute.frame = frame;}];
    }
    return allAttributesInRect;
}

- (void)regroupCells:(BOOL)isRegroup // This method is called from my collection controller when my button is pressed
{
    _isRegroup = isRegroup;
    [self invalidateLayout];
}

有任何想法吗? 谢谢!
1个回答

22

在调用方法时,动画不会起作用。

要更改布局并以新的方式进行动画,最简单的方法是在集合视图上调用performBatchUpdates,针对每个块参数使用nil。这会使您的布局无效,并为您提供新的动画效果。

在执行此操作之前,您需要告诉布局对象您希望出现新的布局。此外,在layoutAttributesForElementsInRect内部,仅检查您的布尔变量,并将分组框架(可能最好是中心)应用于所有属性,就像您现在正在做的那样,但不带有动画。您还需要在layoutAttributesForElementAtIndexPath中再现此代码。

因此,总结如下:

  1. 从当前位置删除invalidate layout调用
  2. 从当前位置删除动画调用,只需修改布局属性
  3. 添加..forElementAtIndexPath代码
  4. 在您的视图控制器中,对布局对象调用regroup方法,然后对集合视图调用performBatchupdates。

这是想看结果的人们的成果 :) http://d.pr/v/QUTF (我有一个故障问题) - Pierre
你需要增加堆栈中“top”项的z索引,你可以在调整框架的同一位置进行。 - jrturton
我已经这样做了,但问题似乎出在其他地方。启用缓慢动画:http://d.pr/v/oEm4 - Pierre
我了解了,你应该提出一个单独的问题。 - jrturton
@Pierre,链接http://d.pr/v/QUTF似乎无法使用。你能分享一下你的实现吗? - Lukas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接