Iphone 只有几个图像的快速滚动
我使用的是Apple在表中使用子视图时显示的方法(下面的大部分内容来自他们的文档)。我只是通过一个rss源输入了大约12幅图像,但这会导致滚动速度变慢——如果我去掉这些图像,它就会平滑地移动。图像不是很大,所以这不是问题。在研究更复杂的解决方案(后台处理等)之前,我能做些什么来改进这项工作吗 谢谢你在这方面给予的帮助Iphone 只有几个图像的快速滚动,iphone,uitableview,scroll,Iphone,Uitableview,Scroll,我使用的是Apple在表中使用子视图时显示的方法(下面的大部分内容来自他们的文档)。我只是通过一个rss源输入了大约12幅图像,但这会导致滚动速度变慢——如果我去掉这些图像,它就会平滑地移动。图像不是很大,所以这不是问题。在研究更复杂的解决方案(后台处理等)之前,我能做些什么来改进这项工作吗 谢谢你在这方面给予的帮助 #define MAINLABEL_TAG 1 #define SECONDLABEL_TAG 2 #define PHOTO_TAG 3 -(UITableVi
#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];
}
看起来每次配置单元时,都会从web重新下载整个图像(或者从硬盘读取,如果URL指向的是硬盘): 这太慢了!
UITableView
的工作方式是重用单元格-每当单元格离开屏幕时,它可能会返回给cellforrowatinexpath
方法,作为下一个可见的单元格
这意味着,每当一个新的单元格可见时,您都在下载并创建它的图像
相反,您有两个选择:
嗯..谢谢..我在想..所以图像没有缓存,这样当图像从视图中滚动时它们会留在内存中?@Allen,没有-因为从视图中滚动的单元格被分配了一个新图像,所以它会丢失它的旧图像。哦…所以他们现在正在解决这个问题,比如检查它是否丢失了图像,然后再去重新获取图像..就像如果照片,图像为零,再次获取图像。如果这没有意义,很抱歉,如果可能的话,只是试图找到一些简单的东西)@Allen-问题是相同的
UITableViewCell
用于表示表视图中不同的实际单元格。假设你看到的是细胞#1,2,3,4,5。然后将#1从屏幕上滚下,出现#6。它实际上与#1使用的#UITableViewCell与#6使用的#UITableViewCell相同。因此,将图像保存在UITableViewCell
中没有意义,因为它现在需要不同的图像<代码>[单元释放]永远不会调用code>,因为返回后不会到达方法中的任何内容
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img = [[UIImage alloc] initWithData:data];