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 _endItemAnimations] 中的 UICollectionView 断言失败
如何滚动另一个 UICollectionView 下方的 UICollectionView?
UICollectionView 单元内部已加载,但 UICollectionView 未显示
UICollectionView 断言失败 -[UICollectionView _updateWithItems:tentativelyForReordering:]