ios UICollectionView重载数据但视图 Flink

f45qwnt8  于 2023-03-14  发布在  iOS
关注(0)|答案(3)|浏览(130)

我有一个UICollectionView和一个定制的UICollectionViewCell来显示我的内容,这些内容应该每秒刷新一次。
我将调用reloadData方法来重新加载整个集合视图以满足我的需要。
但是,但是,每次我重新加载数据时,我的集合视图单元格都会 Flink 。
它看起来像下面的图像。我的应用程序的两秒钟。第一秒是好的。但第二秒,集合视图显示重用的单元格第一(黄色区域),然后显示正确的单元格(配置单元格)最后。这看起来像一个 Flink 。

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

c7rzv4ha1#

我找到了答案,虽然离问题已经很久了。
不要使用reloadData()reloadItems()
使用collectionView.reloadSections(IndexSet(integer: yourSectionIndex))。动画将平滑地发生。

3j86kqsm

3j86kqsm2#

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

对我有帮助。

tnkciper

tnkciper3#

您可以执行以下操作:

UIView.performWithoutAnimation {
    self.collectionView.performBatchUpdates({
        self.collectionView.reloadData()
    }, completion: nil)
}

相关问题