【问题标题】:Jerky scrolling with only a few images只有几张图像的生涩滚动
【发布时间】:2010-11-18 01:53:47
【问题描述】:

我正在使用 Apple 在使用表中的子视图时展示的方法(下面的大部分内容来自他们的文档)。我只通过 rss 提要拉入大约 12 张图像,但这会导致滚动缓慢 - 如果我摆脱图像,它会平滑移动。图像不大,所以这不是问题。在研究更多涉及的解决方案(后台处理等)之前,我可以做些什么来使这项工作变得更好?

感谢您对此提供的任何帮助。

#define MAINLABEL_TAG   1
#define SECONDLABEL_TAG 2
#define PHOTO_TAG       3

-(UITableViewCell *)tableView : (UITableView *)tableView cellForRowAtIndexPath : (NSIndexPath *)indexPath {
    UILabel * mainLabel, * secondLabel;
    UIImageView * photo;
    static NSString * CellIdentifier = @ "Cell";
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        mainLabel = [[[UILabel alloc] initWithFrame:CGRectMake(100.0, 0.0, 210.0, 0.0)] autorelease];
        mainLabel.tag = MAINLABEL_TAG;
        mainLabel.font = [UIFont systemFontOfSize:14.0];
        mainLabel.textAlignment = UITextAlignmentRight;
        mainLabel.textColor = [UIColor blackColor];
        mainLabel.opaque = YES;
        mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview : mainLabel];

        secondLabel = [[[UILabel alloc] initWithFrame:CGRectMake(90.0, 30.0, 220.0, 0.0)] autorelease];
        secondLabel.tag = SECONDLABEL_TAG;
        secondLabel.font = [UIFont systemFontOfSize:12.0];
        secondLabel.textAlignment = UITextAlignmentRight;
        secondLabel.textColor = [UIColor darkGrayColor];
        secondLabel.opaque = YES;
        secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview : secondLabel];

        photo = [[[UIImageView alloc] initWithFrame:CGRectMake(30.0, 3.0, 50.0, 40.0)] autorelease];
        photo.tag = PHOTO_TAG;
        photo.opaque = YES;
        photo.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview : photo];
    } else {
        mainLabel = (UILabel *)[cell.contentView viewWithTag : MAINLABEL_TAG];
        secondLabel = (UILabel *)[cell.contentView viewWithTag : SECONDLABEL_TAG];
        photo = (UIImageView *)[cell.contentView viewWithTag : PHOTO_TAG];
    }
    // Configure the cell.
    mainLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "title"];
    secondLabel.text = [[items objectAtIndex:indexPath.row] objectForKey:@ "teacher"];
    NSString * path = [[items objectAtIndex:indexPath.row] objectForKey:@ "audimage"];
    NSString * mypath = [path stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSURL * url = [NSURL URLWithString:mypath];
    NSData * data = [NSData dataWithContentsOfURL:url];
    UIImage * img = [[UIImage alloc] initWithData:data];
    photo.image = img;
    return cell;
    [cell release];
}

【问题讨论】:

  • [cell release]; 永远不会被调用,因为返回后方法中的任何内容都不会到达

标签: iphone uitableview scroll


【解决方案1】:

看起来每次你配置一个单元格时,你都会从网络上重新下载整个图像(或者从硬盘读取,如果你的 URL 指向的地方):

NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[UIImage alloc] initWithData:data];

这真的很慢! UITableView 的工作方式是重用单元格 - 每次单元格离开屏幕时,它可能会返回给 cellForRowAtIndexPath 方法,以用作下一个可见的单元格。

这意味着每次新单元格变得可见时,您都在下载并创建它的图像。

相反,您有两种选择:

  1. 先把所有图片下载保存下来(如果只有12张,可能不会占用太多内存)。

  2. 根据需要下载图像,如果您收到内存警告,请转储一些缓存图像。这有点难以实现,所以我会先尝试第一个解决方案。

【讨论】:

  • 嗯..谢谢..我在想那个..所以图像没有缓存,这样当图像滚动出视图时它们会留在内存中?
  • @Allen,不,因为滚动出视图的单元格随后被分配了一个新图像,因此它丢失了旧图像。
  • 哦...所以他们现在解决了这个问题,例如检查它是否丢失了图像,然后才去再次获取图像..如果 photo,image 为 nil,则获取再次图像。对不起,如果这没有意义,只是想找到一些简单的东西如果可能的话)
  • @Allen - 问题是相同的UITableViewCell 被用来表示表格视图中不同的实际 单元格。因此,想象一下您正在查看单元格#1、2、3、4、5。然后你将#1 滚动到屏幕外,然后#6 出现。它实际上将是用于#1 的 same UITableViewCell 被重用于#6。所以将图像保存在UITableViewCell 中是没有意义的,因为它现在需要一个不同的图像!
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
相关资源
最近更新 更多