【问题标题】:Reducing cell frame doesn't animate the same as enlarging the frame缩小单元格框架与放大框架的动画效果不同
【发布时间】:2015-06-18 12:57:01
【问题描述】:

使用以下代码,更改单元格的框架,然后为更改设置动画。

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

当增加框架的高度时,动画可以正常工作。 当将其减小到原始大小时,单元格的动画很笨拙,快速降低高度,没有动画,但集合视图的其余部分会为更改设置动画

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

【问题讨论】:

  • 原始值是否与new_h == 200相关?
  • 上面的代码在 didSelectItemAtIndexPath 中,所以它检查属性 new_h,如果是 200,则将其设置为 70,以此类推。从gif可以看出,地址所在的block是逐渐增加的,但是反转是突然的,立即resize到70而不是逐渐的
  • 你能在增加高度时发帖以看到差异并尝试找到解决方案@Nick Ginanto?谢谢你:)

标签: ios animation uicollectionview


【解决方案1】:

查看您的 gif,当您放大单元格时,几乎看起来可能会发生相同的问题(即,背景首先扩大,然后是其余内容)。是的,在第 5 帧中,背景颜色已经消失了。

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

我在想你必须打电话给[self.collectionView.collectionViewLayout invalidateLayout];,然后在collectionView:layout:sizeForItemAtIndexPath:中返回新的大小

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

【讨论】:

  • 不会使布局无效导致布局重新计算,并且不会为更改设置动画?
  • 好吧,我认为您仍然需要为更改设置动画。 1) 使布局无效。 2) 调用performBatchUpdates: 并进行您需要进行的任何更改,以便您可以在此块内的sizeForItemAtIndexPath: 中返回新大小。 3) 确保您在sizeForItemAtIndexPath: 中返回新尺寸。我认为这应该有效。类似于UITableViewbegin/endUpdates
  • 实际上,您甚至可能不需要使布局无效,我认为当您调用performBatchUpdates: 时它可能会自动执行此操作。不过,我认为您需要更改它以在委托方法中返回新的大小,而不仅仅是手动更改单元格的框架。
  • 但这正是我在问题中编写的代码中所做的。 new_h 是 sizeOfItemAtIndexPath 中的大小
  • 是吗?我不确定你的sizeForItemAtIndexPath: 中有什么,所以我不能确定。看起来您正在手动更新单元格本身的大小。您是否能够制作一个较小的示例项目来重现该错误?
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多