在“didSelectItemAt”上放大UICollectionViewCell

时间:2017-09-07 14:16:51

标签: ios swift animation uicollectionview

我需要实现一个看起来像附加的gif的动画。

当您点击一个单元格时,它应该放大,因此单元格之间的间距应保持不变(单元格不应重叠)。当您选择另一个单元格时,当前选定的单元格将设置为原始大小,新选择的单元格将放大同时。

目前,当用户选择我正在为UICollectionView调用reload的单元格时,在 cellForItemAtIndex 中,我使用“CGAffineTransform.scale”保留一些延迟来为图像设置动画。

但是通过这种方法,我没有得到想要的动画,有明显的闪烁。

func animateTheCellOnTapping(cell:RatingFeedbackCell, indexPath:IndexPath) {
    cell.overlayView.transform = CGAffineTransform.identity
    UIView.animate(withDuration: 0.2, animations: {
        if indexPath == self.selectedIndex {
            cell.imagesContainerView.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
        }
    })
    if indexPath != selectedIndex {
        cell.imagesContainerView.transform = CGAffineTransform.identity
    }
}

还有其他办法吗?

Sample Animation

注意

上面的动画我用UIScrollView完成了,但我想用UICollectionView做同样的事情。

1 个答案:

答案 0 :(得分:1)

在自定义UICollectionViewCell - RatingFeedbackCell中,覆盖 isSelected 属性并在那里执行动画。单元格的选择和取消选择将自动处理,无需任何额外的努力。

示例:

class RatingFeedbackCell : UICollectionViewCell
{
    override var isSelected: Bool{
        didSet{
            UIView.animate(withDuration: 0.3, delay: 0.0, options: .curveEaseOut, animations: {
                self.transform = self.isSelected ? CGAffineTransform(scaleX: 1.1, y: 1.1) : CGAffineTransform.identity
            }, completion: nil)

        }
    }
}

isSelected 如何运作,请参阅:https://medium.com/@p.gpt10/uicollectionviewcell-selection-made-easy-41dae148379d