UICollectionviewCell 动画

Posted

技术标签:

【中文标题】UICollectionviewCell 动画【英文标题】:UICollectionviewCell Animations 【发布时间】:2016-07-18 11:09:58 【问题描述】:

我想动画collectionview单元格,动画应该是这样的:

第一个单元格出现,然后延迟一段时间后第二个单元格会出现一些动画,所有单元格都会这样.

如何做到这一点?

【问题讨论】:

【参考方案1】:

一种解决方案是增量创建数据源,以便在设置的时间延迟后添加一个单元格。添加后,插入

拨打电话以设置一个计时器,以根据您喜欢的延迟添加到您的数据源

[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(addToDataSource:) userInfo:nil repeats:YES];

然后在这个方法中每 0.05 秒命中一次(在这个例子中)

-(void)addToDataSource:(NSTimer*)timer

    [self.yourMutableDataSourceArray addObject:OBJECT]

    NSInteger arrayCount = self.yourMutableDataSourceArray.count;

        [self.collectionView performBatchUpdates:^
            [self.collectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:arrayCount-1 inSection:0]]];
         completion:^(BOOL finished) 

        ];

    //Once you have reached the desired count cells you wish, remember to invalidate the timer


performBatchUpdate 表示 collectionView 将重新加载动画。

希望对你有帮助

这是在 Objective-C 中,但如果你用 swift 编写,同样的原则也适用

【讨论】:

@Elan 你的意思是在哪里调用'NSTimer'?您可以从 viewDidLoad 调用它,或者根据需要将其设置为从 IBAction 调用。 @ Jim Tierney 我想要的是它应该像从上到下滚动但它看起来像淡入或淡出.....有什么解决方案吗?【参考方案2】:

这里的另一个解决方案是使用willDisplayCell:forIndexPathdelegate

这是我如何做的示例。

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) 
    if (!loadedIdx.contains(indexPath.row)) 
        let cellContent = cell
        let rotationAngleDegrees : Double = -30
        let rotationAngleRadians = rotationAngleDegrees * (M_PI/180)
        let offsetPositioning = CGPoint(x: collectionView.bounds.size.width, y: -20)
        var transform = CATransform3DIdentity
        transform = CATransform3DRotate(transform, CGFloat(rotationAngleRadians), -50, 0, 1)
        transform = CATransform3DTranslate(transform, offsetPositioning.x, offsetPositioning.y, -50)

        cellContent.layer.transform = transform
        cellContent.layer.opacity = 0.2

        let delay = 0.06 * Double(indexPath.row)
        UIView.animateWithDuration(0.8, delay:delay , usingSpringWithDamping: 0.8, initialSpringVelocity: 0.5, options: .CurveEaseIn, animations:  () -> Void in
            cellContent.layer.transform = CATransform3DIdentity
            cellContent.layer.opacity = 1
        )  (Bool) -> Void in

        

        loadedIdx.append(indexPath.row)
    


loadedIdx 是一个数组,用于将单元格标记为已加载(下次不动画出现)

【讨论】:

我尝试过使用它,但是当我重新加载我的收藏视图时它不起作用 重载时你有没有在loadedIdx数组中removeAllObject 是的,我有 removeAllObject 但它仍然不能按我的意愿工作 我现在正在关注 Jim 的方法,收集行在延迟之后出现,但问题是它看起来不像从上到下滚动,而是看起来像淡入和淡出。

以上是关于UICollectionviewCell 动画的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewCell 展开动画

自定义 UICollectionViewCell contentView 动画

UICollectionviewCell 动画

带有协议的 UICollectionViewCell 动画

UICollectionViewCell 带有约束的动画

如何动画 UICollectionViewCell 扩展?