【问题标题】:Lag in UICollectionView on Scroll滚动时 UICollectionView 的滞后
【发布时间】: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 请检查我的代码,我已经更新了。

标签: ios objective-c uicollectionview uicollectionviewcell


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多