UICollectionView reloadData但是View Blinks

时间:2014-05-19 14:48:07

标签: ios objective-c uicollectionview

我有一个UICollectionView和一个自定义UICollectionViewCell来显示我的内容,应该每秒刷新一次。

我将调用reloadData方法重新加载整个集合视图以满足我的需求。

但是,每次重新加载数据时,我的集合视图单元格都会闪烁。

如下图所示。两秒钟我的应用程序。第一秒就可以了。但第二秒,集合视图首先显示重复使用的单元格(黄色区域),然后最终显示正确的单元格(已配置的单元格)。这看起来像眨眼。

enter image description here

这似乎是一个细胞重用问题。 CollectionView显示单元格而未完全配置它。我怎么能解决它?

我的cellForItemAtIndexPath:方法:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    YKDownloadAnimeCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:[YKDownloadAnimeCollectionCell description] forIndexPath:indexPath];

    YKAnimeDownloadTask *animeDownloadTask = [[YKVideoDownloadTaskManager shared] animeDownloadTasks][indexPath.row];
    [cell setUpWithDownloadAnime:animeDownloadTask editing:self.vc.isEditing];
    cell.delegate = self;

    if (self.vc.isEditing) {
        CABasicAnimation *imageViewAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
        imageViewAnimation.fromValue = @(-M_PI/64);
        imageViewAnimation.toValue = @(M_PI/128);
        imageViewAnimation.duration = 0.1;
        imageViewAnimation.repeatCount = NSUIntegerMax;
        imageViewAnimation.autoreverses = YES;
        [cell.coverImageView.layer addAnimation:imageViewAnimation forKey:@"SpringboardShake"];

        CABasicAnimation *deleteBtnAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
        deleteBtnAnimation.fromValue = @(-M_PI/32);
        deleteBtnAnimation.toValue = @(M_PI/32);
        deleteBtnAnimation.duration = 0.1;
        deleteBtnAnimation.repeatCount = NSUIntegerMax;
        deleteBtnAnimation.autoreverses = YES;
        [cell.deleteBtn.layer addAnimation:deleteBtnAnimation forKey:@"SpringboardShake1"];
    } else {
        [cell.coverImageView.layer removeAllAnimations];
        [cell.deleteBtn.layer removeAllAnimations];
    }

    return cell;
}

2 个答案:

答案 0 :(得分:0)

self.collectionView.reloadItems(at: self.collectionView.indexPathsForVisibleItems)

对我有帮助。

答案 1 :(得分:0)

好了,我已经找到答案了,尽管距离问题已经很久了。

请勿使用reloadData()reloadItems()

使用collectionView.reloadSections(IndexSet(integer: yourSectionIndex))。动画将顺利进行。