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];
}

任何的想法 ?谢谢 !

4

1 回答 1

22

动画在您调用它们的方法中不起作用。

要更改布局和动画到一个新的,最简单的方法是调用performBatchUpdates你的集合视图,nil每个块参数。这会使您的布局无效并为您设置新布局。

在执行此操作之前,您将告诉布局对象您希望新布局发生。此外,在内部layoutAttributesForElementsInRect,只需检查您的布尔变量并将分组帧(可能中心会更好)应用到您现在所做的所有属性,但没有动画。您还需要在layoutAttributesForElementAtIndexPath.

所以,总结一下:

  1. 从它所在的位置删除您的无效布局调用
  2. 从所在位置移除动画调用,只需修改布局属性
  3. 也添加 ..forElementAtIndexPath 代码
  4. 在您的视图控制器中,调用布局对象的重组方法,然后调用集合视图的 performBatchupdates。
于 2012-10-21T16:12:20.413 回答