【问题标题】:Animate the changing of data in a collectionView在 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 不幸的是没有 - 下面的解决方案并没有真正做到我最初想要的。我敢肯定,如果我改变我的方法,它们会产生类似的效果,但这并不能真正解释为什么我尝试的方法不起作用。
  • 谢谢,是的,我最终只是切换到了表格视图。这很奇怪,因为我无法在单独的新项目中重新创建它只是为了测试它......

标签: ios swift animation uicollectionview


【解决方案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 已经是一个异步方法。
    • 是的,试过了——我真的很想了解这个问题,而不是仅仅修补它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多