UICollectionView:animation自定义布局

我在UICollectionView中显示大量的图像单元格。 用一个button,我希望能够把我的所有细胞分组在第一个。

这是行之有效的,但是当我试图添加一个animation转换到我的重组行动,没有任何反应。

这里我使用自定义布局的方法:

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

任何想法 ? 谢谢 !

animation将不会从您调用的方法中起作用。

要将布局和animation更改为新布局,最简单的方法是在集合视图上调用performBatchUpdates ,每个块参数都为nil 。 这使您的布局无效,并为您的新animation制作animation。

在这之前,你会告诉布局对象你想要新的布局发生。 另外,在layoutAttributesForElementsInRect里面,只需检查你的布尔variables,然后像现在这样做,把分组的帧(可能中心会更好)应用于所有的属性,但是没有animation。 您还需要在layoutAttributesForElementAtIndexPath重现此代码。

总之:

  1. 从中删除您的无效布局调用
  2. 从他们所在的位置删除animation调用,只需修改布局属性即可
  3. 添加..forElementAtIndexPath代码
  4. 在您的视图控制器中,调用布局对象的重组方法,然后调用集合视图上的performBatchupdates。