Ios 缩小单元框架不';t设置动画与放大帧相同

Ios 缩小单元框架不';t设置动画与放大帧相同,ios,animation,uicollectionview,Ios,Animation,Uicollectionview,使用以下代码,更改单元格的帧,然后设置更改的动画 if (_new_h == 200){ _new_h = 70; } else{ _new_h = 200; } CustomCell *cell = (CustomCell*)[self.collectionView cellForItemAtIndexPath:indexPath]; [self.collectionView performBatchUpdate

使用以下代码,更改单元格的帧,然后设置更改的动画

   if (_new_h == 200){
        _new_h = 70;
    }
    else{
        _new_h = 200;
    }

    CustomCell *cell = (CustomCell*)[self.collectionView cellForItemAtIndexPath:indexPath];

    [self.collectionView performBatchUpdates:^{
        cell.frame = CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, _new_h);
    } completion:nil];
增加帧的高度时,动画将正常工作。 当将其减小到原始大小时,单元的动画很笨重,在没有动画的情况下会快速降低高度,但collectionview的其余部分会为更改设置动画


为什么只有在降低高度时才会出现这种情况?

看你的gif,当你放大单元格时,看起来可能也会出现同样的问题(即,背景先展开,然后是其他内容)。是的,在第5帧中,背景色已经消失了

要调整
UICollectionViewCells
的大小,您是否通常会在
sizeForItemAtIndexPath:
中设置大小,而不是手动设置单元格的框架

我想你应该调用
[self.collectionView.collectionViewLayout]collectionView:layout:sizeForItemAtIndexPath:


我不确定动画为什么会这样,但我不认为这是更改单元格大小的首选方法,因此可能会影响它。

原始值是否与
new\u h==200
相关?上面的代码在didSelectItemAtIndexPath中,因此它会检查属性new\u h,如果它是200,它会将其设置为70,等等从gif中你可以看到地址逐渐增加的块,但反过来是突然的,立即调整到70,而不是逐渐增加。当地址增加高度时,你可以看到差异并尝试找到解决方案@Nick Ginanto?谢谢:)布局无效不会导致布局重新计算,而不会设置更改的动画吗?我认为您仍然需要设置更改的动画。1) 使布局无效。2) 调用
performbatchudates:
并进行任何需要的更改,以便可以在此块内的
sizeForItemAtIndexPath:
中返回新的大小。3) 确保在
sizeForItemAtIndexPath:
中返回新的大小。我认为这应该行得通。它类似于
UITableView
begin/endUpdates
实际上,您甚至不需要使布局无效,我认为当您调用
performBatchUpdates:
时,它可能会自动执行此操作。不过,我认为您需要更改它以在委托方法中返回新的大小,而不仅仅是手动更改单元格的帧。但这正是我在问题中编写的代码中所做的
new_h
大小是否为SizeFiteMatinDexpath?是吗?我不确定您的
SizeFormiteIndeXPath:
中有什么内容,所以我不能确定。看起来您只是在手动更新单元格本身的大小。您是否能够制作一个较小的示例项目来重现错误?