重新加载和调用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闪烁的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS - AJAX 调用后无法重新加载组合

调用解除方法后如何正确重新加载 UIViewController?

在获取API调用之前重新启动加载屏幕

重新加载表数据时未调用 CellForRowAtIndexPath

jquery ajax 调用kkpager插件 异步加载重新生成分页后,点击页数还是跟首次加载一样

如何在javascript中单击按钮重新加载网页,但在重新加载调用函数后