【问题标题】:UICollectionView reloadSections with animation带有动画的 UICollectionView reloadSections
【发布时间】:2013-10-16 21:29:48
【问题描述】:

我想用一些有趣的动画重新加载 UICollectionView。在 UITableView 中有一个名为reloadSections:withRowAnimation 的方法。 但是在 UICollectionView 中只有reloadSections

如何自定义 reloadSections 动画?我肯定在 App Store 的应用中看到了这一点。

【问题讨论】:

标签: objective-c animation uicollectionview


【解决方案1】:

就那样做吧:

[self.collectionView performBatchUpdates:^{
    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:0]];
} completion:nil];

【讨论】:

  • 那么你必须深入研究并编写自己的UICollectionViewLayout。您无法将其与 UITableView 进行比较,因为 UICollectionView 不仅可以在一维(如 UITableView)或二维(如 UICollectionViewFlowLayout)中显示数据。您不受任何限制,因此除了内置淡入淡出之外没有任何琐碎的动画。自定义布局无法使用不同的从顶部/底部/中间滑动动画,因为无法全局定义动画!!!
【解决方案2】:

Swift 3 版本:

collectionView.performBatchUpdates({
    let indexSet = IndexSet(integer: 0)
    self.collectionView.reloadSections(indexSet)
}, completion: nil)

【讨论】:

  • 这里有泄漏。使用[weak self]
  • 没有泄漏,也不需要[弱自我]。 [weak self] 只有创建循环依赖的长寿命闭包才需要。这个闭包甚至没有逃脱。
  • 没错,它的非转义闭包,所以不需要弱自我
【解决方案3】:

这里的这篇文章值得一读: http://victorlin.me/posts/2016/04/29/uicollectionview-invalid-number-of-items-crash-issue

TLDR:

结果是 performBatchUpdates 在调用给定闭包之前先调用 collectionView(:numberOfItemsInSection:) 以了解项目编号。接下来,它调用闭包,最终,它再次调用 collectionView(:numberOfItemsInSection:) 来检查数字。这里是抛出断言异常的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多