在 collectionView 中动画化数据的变化

Posted

技术标签:

【中文标题】在 collectionView 中动画化数据的变化【英文标题】:Animate the changing of data in a collectionView 【发布时间】:2016-01-07 15:41:56 【问题描述】:

我想为我的 UICollectionView 中的更改设置动画。我将 collectionView 作为@IBOutlet:

@IBOutlet weak var collectionView: UICollectionView!

然后集合视图重新加载(这样我就可以更改每个单元格的 alpha),如下所示:

var bulkAwardMode = false;

@IBAction func bulkAwardToggleClicked(sender: UIButton) 
    if(bulkAwardMode == false) 
        bulkAwardMode = true
     else 
        bulkAwardMode = false
    
    dispatch_async(dispatch_get_main_queue(), 
        self.collectionView.reloadData()
    )

但是由于这不是动画,我尝试将reloadData() 行更改为self.collectionView.reloadSections(NSIndexSet(index: 0)),但这只会导致崩溃并出现错误attempt to create view animation for nil view

我显然做错了什么,但我不太确定是什么。我也尝试将代码放在UIView.animateWithDuration 块中,但也失败了。

【问题讨论】:

所以你要淡入,淡出每个单元格的数据,然后1秒后显示其他数据? cellForItemAtIndexPath 中,我根据批量奖励是否开启来设置阿尔法,所以reloadData() 会更新阿尔法——我希望该更改具有动画效果。那有意义吗?如果有帮助,我计划让用户选择单个单元格,然后在启用批量奖励的情况下变成不同的颜色。 @Ben 你知道如何解决这个错误吗?谢谢! @sridvijay 不幸的是没有 - 下面的解决方案并没有真正做到我最初想要的。我敢肯定,如果我改变我的方法,它们会产生类似的效果,但这并不能真正解释为什么我尝试的方法不起作用。 谢谢,是的,我最终只是切换到了表格视图。这很奇怪,因为我无法在单独的新项目中重新创建它只是为了测试它...... 【参考方案1】:

你可以试试:

collectionView.performBatchUpdates( () -> Void in
   // here you can insert ,delete and animate cells
)  (success) -> Void in    
   //completion block

【讨论】:

【参考方案2】:

使用 UITableViewDelegate

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) 
     UIView.animateWithDuration(0.4, animations:  () -> Void in
            cell.alpha = self.bulkAwardMode
        )

当您重新加载数据时调用此函数。

否则,你会得到可见的单元格:

@IBAction func bulkAwardToggleClicked(sender: UIButton) 
    if(bulkAwardMode == false) 
        bulkAwardMode = true
     else 
        bulkAwardMode = false
    
    var visibleCells = tableView.visibleCells
    for cell in visibleCells 
          UIView.animateWithDuration(0.4, animations:  () -> Void in
             cell.alpha = self.bulkAwardMode
          )
    

【讨论】:

这是一个collectionView而不是一个tableView,但我假设有一个等价物。谢谢 Edward - 你能解释一下为什么 reloadItemsAtIndexPaths 不起作用吗? 您是否尝试删除 dispatch_async? ReloadData 已经是一个异步方法。 是的,试过了——我真的很想了解这个问题,而不是仅仅修补它!

以上是关于在 collectionView 中动画化数据的变化的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CollectionView 单元格上添加过渡动画?

简单的collectionView动画

触摸 CollectionView 时禁用动画?

使用动画更改 CollectionView 位置,但在第一次滚动时向后移动

Swift 动画 CollectionView 项目点击

PHAsset 图像在 CollectionView 中显示时像素化