重新加载和调用requestImageForAsset时UICollectionView闪烁
Posted
技术标签:
【中文标题】重新加载和调用requestImageForAsset时UICollectionView闪烁【英文标题】:UICollectionView Flicker When Reloading And Calling requestImageForAsset 【发布时间】:2016-08-27 09:40:39 【问题描述】:我有一个 UICollectionView 的问题,我认为我已将其范围缩小到以下区域。问题是,当我在 UICollectionView 上调用重新加载时,会出现闪烁并加载 1 个图像,然后是正确的图像第二个。几乎就像您滚动新单元格并更新它们但没有任何滚动一样。
现在我用普通的方法测试了它
sampleImage.image = [UIImage imageNamed:@"LogoHome"];
而且我没有任何闪烁,因此我将其范围缩小到以下代码
[self.imageManager requestImageForAsset:[self.arrayPhotoAssets objectAtIndex:indexPath.row]
targetSize:CGSizeMake(imageWidth, imageHeight)
contentMode:PHImageContentModeAspectFill
options:nil resultHandler:^(UIImage *result, NSDictionary* info)
UIImageView *sampleImage = (UIImageView *)[cell viewWithTag:1];
sampleImage.image = result;
];
在
里面- (UICollectionViewCell *) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
有什么方法可以调整代码以防止上述情况发生吗?这是完整的 sn-p:
- (UICollectionViewCell *) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
////// GALLERY COLLECTION VIEW
if(collectionView.tag == 1)
static NSString *cellIdentifier = @"galleryCell";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
float imageWidth = 77;
float imageHeight = 77;
UIScreen *mainScreen = [UIScreen mainScreen];
//NSLog(@"%f",mainScreen.bounds.size.width);
// IPHONE 6
if(mainScreen.bounds.size.width == 375)
imageWidth = 92;
imageHeight = 92;
// IPHONE 6 PLUS
if(mainScreen.bounds.size.width == 414)
imageWidth = 102;
imageHeight = 102;
[self.imageManager requestImageForAsset:[self.arrayPhotoAssets objectAtIndex:indexPath.row]
targetSize:CGSizeMake(imageWidth, imageHeight)
contentMode:PHImageContentModeAspectFill
options:nil resultHandler:^(UIImage *result, NSDictionary* info)
UIImageView *sampleImage = (UIImageView *)[cell viewWithTag:1];
sampleImage.image = result;
];
return cell;
UICollectionViewCell *cell;
return cell;
【问题讨论】:
【参考方案1】:我建议您在尝试调用requestImageForAsset
之前设置sampleImage.image = nil
。这将清除您的图像视图,从而消除闪烁。
UIImageView *sampleImage = (UIImageView *)[cell viewWithTag:1];
sampleImage.image = nil;
[self.imageManager requestImageForAsset:[self.arrayPhotoAssets objectAtIndex:indexPath.row]
targetSize:CGSizeMake(imageWidth, imageHeight)
contentMode:PHImageContentModeAspectFill
options:nil resultHandler:^(UIImage *result, NSDictionary* info)
sampleImage.image = result;
];
【讨论】:
确实改进了它,仍然有轻微的闪烁,但它不再在 2 个图像之间闪烁。 闪烁是因为延迟,在将 imageview 的图像设置为零、下载新图像和将新图像分配给 imageview 之间。如果你想避免它,requestImageForAsset 必须缓存下载的图像。 谢谢,这不是“PHCachingImageManager”的用途吗?我正在查看缓存库,这就是我在以前的版本中所做的,但我想这次我会使用上面的。【参考方案2】:在传递给 requestImage (PHImageRequestOptions) 的选项中将“isSynchronous”设置为 true 为我修复了闪烁问题。
【讨论】:
以上是关于重新加载和调用requestImageForAsset时UICollectionView闪烁的主要内容,如果未能解决你的问题,请参考以下文章
调用解除方法后如何正确重新加载 UIViewController?
重新加载表数据时未调用 CellForRowAtIndexPath