Swift 2 - performBatchUpdates - 当 UICollectionView 框架内可见时,一个一个地为单元格设置动画

Posted

技术标签:

【中文标题】Swift 2 - performBatchUpdates - 当 UICollectionView 框架内可见时,一个一个地为单元格设置动画【英文标题】:Swift 2 - performBatchUpdates - Animate cell one by one when visibile inside the UICollectionView frame 【发布时间】:2015-11-04 12:43:54 【问题描述】:

我正在尝试为框架中UICollectionView 可见的每个单元格设置动画。 每次滚动时,动画都会出现一个新单元格。

我在cellForItemAtIndexPath 中使用performBatchUpdates 执行此操作,但是,动画同时应用于所有单元格,而且速度非常快。 1秒的动画好像没认出来。

此外,我正在尝试找到在按下按钮但未成功时将动画应用于单元格的方法。

我使用的代码是:

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell

    let Cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CellClass

    self.collectionView?.performBatchUpdates(
                        Cell.layer.cornerRadius = 200
                        return
                        )
                            completed in

                            UIView.animateWithDuration(1, animations: 
                                Cell.layer.cornerRadius = 0
                            )
                        

    Cell.playAnimationBtn.layer.setValue(indexPath.row, forKey: "indexPlayBtn")


@IBAction func actionGetAnimation(sender: UIButton)

    let indexUser = (sender.layer.valueForKey("indexPlayBtn")) as! Int

    //Cell selected do animation corners = 200

【问题讨论】:

【参考方案1】:

您可以在将动画移动到willDisplayCell(_:cell:indexPath:) 时完成这项工作。每次将要显示新单元格时都会调用该方法。

您不能将UIView.animateWithDuration 用于图层属性。为此,您必须使用CABasicAnimation

如果您想在用户按下按钮时为单元格设置动画,您可以从下面的代码示例中调用animateCellAtIndexPath。您必须知道单元格的 indexPath 才能这样做。在本例中,当用户选择单元格时,我调用此方法。

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) 
    animateCell(cell)


func animateCell(cell: UICollectionViewCell) 
    let animation = CABasicAnimation(keyPath: "cornerRadius")
    animation.fromValue = 200
    cell.layer.cornerRadius = 0
    animation.toValue = 0
    animation.duration = 1
    cell.layer.addAnimation(animation, forKey: animation.keyPath)


func animateCellAtIndexPath(indexPath: NSIndexPath) 
    guard let cell = collectionView.cellForItemAtIndexPath(indexPath) else  return 
    animateCell(cell)


func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
    animateCellAtIndexPath(indexPath)

【讨论】:

非常感谢!这对我有很大帮助。但是,我在写我的问题时感到困惑。有没有办法为按下的按钮而不是视图设置动画? 您要为 Button 的哪个属性设置动画? 您可以在自定义 CellClass 中为按钮的 alpha 设置动画。要为 alpha 设置动画,您可以使用 UIView.animateWithDuration 谢谢,我找不到告诉 CellClass 按钮有动画的方法。如果我按所有这些开始动画 您连接到按钮的IBAction 必须在CellClass 中,而不是在视图控制器中。

以上是关于Swift 2 - performBatchUpdates - 当 UICollectionView 框架内可见时,一个一个地为单元格设置动画的主要内容,如果未能解决你的问题,请参考以下文章

为 collectionview 链接 performBatchUpdates

UITableView 意外反弹 beginUpdates()/endUpdates()/performBatchUpdates()

UICollectionView performBatchUpdates:动画所有部分

performBatchUpdates 的噩梦崩溃

UICollectionView 在 performBatchUpdates 上崩溃

多个 CollectionView PerformBatchUpdates