滚动时 UICollectionView 的滞后

Posted

技术标签:

【中文标题】滚动时 UICollectionView 的滞后【英文标题】:Lag in UICollectionView on Scroll 【发布时间】:2015-09-24 07:32:40 【问题描述】:

我使用UICollectionView 显示存储在NSMutableArray 中的一些图像

这是我的 cellForItemAtIndexPath 代码

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath


    CollectionViewCell *cell = (CollectionViewCell*)[collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCell" forIndexPath:indexPath];
    if (indexPath.row<self.bookMarksArray.count) 
        cell.bookmarkImage.image = [self.bookMarksimages objectAtIndex:indexPath.row];
        cell.bookmarkTitle.text =[self.bookMarkNames objectAtIndex:indexPath.row];
    else
    
        UIImage *bookMarkImage=[UIImage imageNamed:@"emptyCell.png"];
        cell.bookmarkImage.image = bookMarkImage;
        cell.bookmarkTitle.text =@"";

    

    cell.removeBtn.enabled = NO;
    cell.delegate = self;
    return cell;

我在数组 self.bookMarksImages 中最多有 32 个项目,当我滚动收藏视图时,我可以注意到滚动有延迟(仅第一次)。

但是当我换行时 cell.bookmarkImage.image = [self.bookMarksimages objectAtIndex:indexPath.row];

带有静态图片 cell.bookmarkImage.image = [UIImage imageNamed:@"emptyCell.png"];

我可以看到滚动没有延迟,我的收藏视图滚动顺畅。

这是我的书签图像初始化代码。

-(void)getAllBookmarkImages

    self.bookMarksimages = [[NSMutableArray alloc] init];
    self.bookMarkNames = [[NSMutableArray alloc] init];
    NSArray *bookMarksArray = [BookMarks getBookMarks];
    for (int i=0; i<self.bookMarksArray.count; i++) 
        NSDictionary *bookmarkInfo = [bookMarksArray objectAtIndex:i];
        UIImage *bookMarkImage=[UIImage imageWithContentsOfFile:[BookMarks documentsPathForFileName:[bookmarkInfo objectForKey:@"IMAGE"]]];

        [self.bookMarksimages addObject:bookMarkImage];
        [self.bookMarkNames addObject:[bookmarkInfo objectForKey:@"TITLE"]];
    

为什么数组self.bookMarksimages 会导致延迟?

【问题讨论】:

你能在你创建bookMarksimages数组的地方添加代码吗? @joern 请检查我的代码,我已经更新了。 【参考方案1】:

造成这个问题的因素有很多

1.图片大小

2.图像位置

解决方法是在图像路径的帮助下将图像加载到异步线程中。制作图像路径数组,而不是图像

- (void) loadImageFromPath:(NSString*)path
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^
    NSData *data= [NSData dataWithContentsOfFile:path];
    UIImage *theImage=[UIImage imageWithData:data];

    dispatch_async(dispatch_get_main_queue(), ^
        cell.bookmarkImage.imagee=theImage;
  );
     );
 

用法

[cell loadImageFromFile:[self.bookMarksimages objectAtIndex:index]];

【讨论】:

使用你的解决方案,我在每一个滚动上都面临滞后,之前它只是在第一次滚动上。 你在数组中保存了什么? 我将图像路径保存在数组中并使用了您的解决方案,在我的自定义单元格中添加了方法 loadImagesForPath 并替换了您的行 cell.bookmarkImage.imagee=theImage;与 Self.bookmarkImage.image=theImage; der 一定是缺少了它不可能 @walinaqvi 图片尺寸太大而无法放入 UICollectionView 以平滑滚动的可能性更大。最好将其缩小到每张图片小于 50kb。

以上是关于滚动时 UICollectionView 的滞后的主要内容,如果未能解决你的问题,请参考以下文章

Objective C uiCollectionView 滚动和加载图像让它感觉滞后

UICollectionView 滚动滞后于核心情节

UICollectionViewCell 中的 UICollectionView 滚动缓慢/滞后

UICollectionView 滚动 SWIFT 滞后/缓慢

UICollectionView 从 NSAttributedString 图像滚动滞后/断断续续

添加第三个 UICollectionView 后 UIScrollView 明显的滚动滞后