UICollectionView insertItem -> 调整动画时间?

Posted

技术标签:

【中文标题】UICollectionView insertItem -> 调整动画时间?【英文标题】:UICollectionView insertItem -> adjust animation time? 【发布时间】:2013-08-15 09:39:19 【问题描述】:

所以,我有一个 UICollectionView 我可以在其中插入新项目。

我使用了Collection View Programming Guide 中的大部分建议 - “使插入和删除动画更有趣”部分

有没有办法调整动画时间? (也许我只是在文档中错过了它,但找不到任何相关信息)

PS:如果我可以编辑曲线,那也太酷了。你知道 Ease-In-Out 等等。

【问题讨论】:

【参考方案1】:

您可以使用 CALayer 更改任何动画速度。所以对于 UICollectionView 这看起来像下面这样:

[self.collectionView.viewForBaselineLayout.layer setSpeed:0.1f];

而且你可以改回原来的速度:

[self.collectionView.viewForBaselineLayout.layer setSpeed:1.0f];

为此,您可能需要导入 QuartzCore:

#import <QuartzCore/QuartzCore.h>

【讨论】:

太棒了,这完全按照我想要的方式工作。不会知道“viewForBaselineLayout”的层是我需要编辑的层。 不过说实话,这也调整了UiCollectionViewItems里面的很多动画。像动画 UIImageViews。然后必须调整那些动画的持续时间以保持速度。 是的,虽然这是一种骇人听闻的方式,但很容易。也许您可以找到更好的视图来设置速度。这只是一个快速测试并且有效。 很有趣,但正如你所说,很老套。【参考方案2】:

或者干脆做

[UIView animateWithDuration:0.5f animations:^(void) 
  [self.collectionView insertItemsAtIndexPaths:@[newIndexPath]];
];

动画持续时间会影响集合视图插入动画的内部持续时间。

【讨论】:

这是要走的路。您也可以在-performBatchUpdates 上使用您想要的任何类型的动画块调用它,它会在那里执行任何更新! 尽管公认的答案很聪明,但这是最不可能产生不良副作用的解决方案。【参考方案3】:

您无法使用 Apple 提供的布局方法调整动画。如果您想自定义动画,您需要通过属性隐藏项目(仅显示和空白空间),请自己制作动画,并在动画结束时通过属性将项目重新弹出。

我问过一个关于自定义移动动画的类似问题,但共识就是我所描述的。如果需要,可以为自己制作动画。

这个问题展示了如何做一个自定义删除动画,自定义插入应该类似:UICollectionView horizontal scrolling, deleting last item, animation not working

【讨论】:

这是真的,而且很糟糕。不过,单元格与其他视图一样是一个视图,因此您可以对它进行任何您喜欢的动画,只要到最后单元格的位置和大小与布局属性匹配即可。 @jrturton 那么如何防止设置新属性会触发系统动画呢? 出现/消失属性与最终属性相同,因此不会出现动画。我只为自定义选择动画而不是插入做了这个(手动动画集合视图),所以这主要是推测!

以上是关于UICollectionView insertItem -> 调整动画时间?的主要内容,如果未能解决你的问题,请参考以下文章

折叠UICollectionView

-[UICollectionView _endItemAnimations] 中的 UICollectionView 断言失败

如何滚动另一个 UICollectionView 下方的 UICollectionView?

UICollectionView 单元内部已加载,但 UICollectionView 未显示

UICollectionView 断言失败 -[UICollectionView _updateWithItems:tentativelyForReordering:]

UITableviewCell 中的 UICollectionView。添加约束后,UICollectionView 不显示