UICollectionView reloadData 但查看闪烁

Posted

技术标签:

【中文标题】UICollectionView reloadData 但查看闪烁【英文标题】:UICollectionView reloadData But View Blinks 【发布时间】:2014-05-19 14:48:06 【问题描述】:

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

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

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

看起来像下面的图片。我的应用程序的两秒钟。第一秒没问题。但是第二秒,集合视图首先显示重用的单元格(黄色区域),然后最后显示正确的单元格(配置的单元格)。看起来像眨眼。

这似乎是一个单元重用问题。 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;

【问题讨论】:

您是否使用带有 xib 的自定义单元格? @pawan 我所有的代码都在目标c中 如果你调用[collectionView reloadItemsAtIndexPaths:@[indexPath1, ...]]而不是reloadData,它还会闪烁吗? 你为什么要每秒刷新一次收藏视图? 如果在调用reloadData 之前设置[UIView setAnimationsEnabled:NO] 会怎样? (在重新加载/显示周期结束后,您可能需要稍后在代码中将其设置回 [UIView setAnimationsEnabled:YES])。 【参考方案1】:

好吧,虽然问题已经很久了,但我找到了答案。

不要使用reloadData()reloadItems()

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

【讨论】:

嘿!非常感谢你做的这些! :) 你让我免于花更多时间在我的低薪时薪副业上。大声笑。 @GlennPosadas 很高兴它可以提供帮助。希望你能找到更好的工作。 即使这会导致眨眼:( 是的,它仍然会微微闪烁【参考方案2】:
self.collectionView.reloadItems(at: self.collectionView.indexPathsForVisibleItems)

对我有帮助。

【讨论】:

它仍然在闪烁

以上是关于UICollectionView reloadData 但查看闪烁的主要内容,如果未能解决你的问题,请参考以下文章

带有 TableView 和 CollectionView 的 UiView 不会随机刷新

折叠UICollectionView

-[UICollectionView _endItemAnimations] 中的 UICollectionView 断言失败

如何滚动另一个 UICollectionView 下方的 UICollectionView?

UICollectionView 单元内部已加载,但 UICollectionView 未显示

UICollectionView 断言失败 -[UICollectionView _updateWithItems:tentativelyForReordering:]