UICollectionView不能平滑滚动

时间:2017-08-22 06:17:57

标签: ios objective-c uicollectionview

我的项目中有一个集合视图,其中包含大量来自Web服务的数据。当我垂直滚动集合视图时,它不会平滑滚动。

我使用SDWebImage异步加载图片。

以下是cellForItemAtIndexPath的代码:

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CategoryListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CategoryListCell" forIndexPath:indexPath];

    cell.movName.text = [nameArray objectAtIndex:indexPath.item];

    num = [[numArray objectAtIndex:indexPath.item]integerValue];
    cell.itemNo.text = [NSString stringWithFormat:@"%ld", (long)num];


    [cell.movImage sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",[imageArray objectAtIndex:indexPath.item]]] placeholderImage:[UIImage imageNamed:@"Main_Logo.png"]];
    [cell.movImage setShowActivityIndicatorView:YES];
    [cell.movImage setIndicatorStyle:UIActivityIndicatorViewStyleWhite];

    return cell;
}

当我在Simulator上运行项目时,它可以顺利滚动,但在物理设备上运行它时,它不能平滑滚动。我怎么解决这个问题?

3 个答案:

答案 0 :(得分:2)

for loop看起来像罪魁祸首,基于它有多大。 SDWebImage负责在后台线程上进行操作,所以应该没问题。

但是,对方法collectionView:cellForRowAtIndexPath:进行概要分析并计算渲染每个单元格所需的时间。如果超过0.016秒 - 这是导致性能延迟的原因。下面是您可以快速用于衡量单元格渲染性能的代码。

NSDate *methodStart = [NSDate date];

CategoryListCell *cell = [[CategoryListCell alloc]init];
cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CategoryListCell" forIndexPath:indexPath];

cell.movName.text = [nameArray objectAtIndex:indexPath.item];

for (int i=0; i<=numArray.count; i++)
{
    num = [[numArray objectAtIndex:indexPath.item]integerValue];
    cell.itemNo.text = [NSString stringWithFormat:@"%ld", (long)num];
}


[cell.movImage sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",[imageArray objectAtIndex:indexPath.item]]] placeholderImage:[UIImage imageNamed:@"Main_Logo.png"]];
[cell.movImage setShowActivityIndicatorView:YES];
[cell.movImage setIndicatorStyle:UIActivityIndicatorViewStyleWhite];

NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"executionTime = %f", executionTime);

有关快速分析此方法的详细信息,请查看:How to log a method's execution time exactly in milliseconds?

答案 1 :(得分:0)

我认为,你错了行代码。因此,它不会在collectionView中平滑。您可以在背景下设置它,也可以在函数cellForItemAtIndexPath之外计算它。

答案 2 :(得分:0)

我真的没有看到很多问题。我想指出几件事。

  1. 您不必要地在cellForItemAtIndexPath中启动集合视图单元格。 dequeueReusableCellWithReuseIdentifier:forIndexPath:将始终返回一个单元格。

  2. 你的for循环在cellForItemAtIndexPath中有什么作用?它设置了itemNo文本numArray计数次数。我误读了吗?

  3. 你在movImage有圆角吗?然后尝试没有圆角,看看你是否能看到差异。渲染圆角很重。