表视图慢滚动问题

时间:2011-12-05 14:21:47

标签: iphone ios uitableview

我在表视图的自定义单元格中使用5个标签,1个按钮,1个图像视图。但是当我运行我的程序时,表格的滚动速度很慢,而且还有一些标签被覆盖。如何提高表格滚动的性能我的代码如下 感谢。

 #define NAMELABEL_TAG 1
 #define VALUELABEL_TAG 2
 #define MYPRICELABEL_TAG 3
 #define SAVEPRICELABEL_TAG 4
 #define PRODUCTIMAGELABEL_TAG 5
 #define VLABEL_TAG 6
 #define YLABEL_TAG 7
 #define SLABEL_TAG 8

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


UILabel *nameLabel,*valueLabel,*myPriceLabel,*savePriceLabel,*vLabel,*yLabel,*sLabel;
UIImageView *productImage;
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];



///my code....

 //CONFIGURE THE SLabel LABEL
 sLabel=[[[UILabel alloc]initWithFrame:CGRectMake(60, 32, 80, 32)]autorelease];
 sLabel.tag=SLABEL_TAG;
 //yLabel.textColor=[UIColor redColor];
 sLabel.font=[UIFont systemFontOfSize:12.0];

 //ADD THE LABEL TO CELLS CONTENT VIEW
 [cell.contentView addSubview:sLabel];


 //CONFIGURE THE YNAME LABEL
 yLabel=[[[UILabel alloc]initWithFrame:CGRectMake(185, 18, 80, 18)]autorelease];
 yLabel.tag=NAMELABEL_TAG;
 //yLabel.textColor=[UIColor redColor];
 yLabel.font=[UIFont systemFontOfSize:12.0];
 //ADD THE LABEL TO CELLS CONTANT VIEW
 [cell.contentView addSubview:yLabel];

 //CONFIGURE THE NAME LABEL
 nameLabel=[[[UILabel alloc]initWithFrame:CGRectMake(60, 0, 140, 20)]autorelease];
 nameLabel.tag=NAMELABEL_TAG;
 nameLabel.textColor=[UIColor redColor];
 //ADD THE LABEL TO CELLS CONTANT VIEW
 [cell.contentView addSubview:nameLabel];
 //configure the value label
 valueLabel=[[[UILabel alloc]initWithFrame:CGRectMake(112, 18, 60, 18)]autorelease];
 valueLabel.tag=VALUELABEL_TAG;
 valueLabel.font=[UIFont systemFontOfSize:12.0];
    //valueLabel.font=[UIFont fontWithName:@"verdana" size:12.0];
    //valueLabel.text=[UIFont 
 valueLabel.textColor=[UIColor redColor];
 [cell.contentView addSubview:valueLabel];

 //CONFIGURE THE myprice LABEL
 myPriceLabel=[[[UILabel alloc]initWithFrame:CGRectMake(262, 18, 40, 18)]autorelease];
 myPriceLabel.tag=MYPRICELABEL_TAG;
 myPriceLabel.font=[UIFont systemFontOfSize:12.0];
 myPriceLabel.textColor=[UIColor redColor];
 //ADD THE LABEL TO CELLS CONTACT VIEW
 [cell.contentView addSubview:myPriceLabel];

 //CONFIGURE THE saveprice LABEL
 savePriceLabel=[[[UILabel alloc]initWithFrame:CGRectMake(135, 32, 50, 32)]autorelease];
 savePriceLabel.tag=SAVEPRICELABEL_TAG;
 savePriceLabel.font=[UIFont systemFontOfSize:12.0];
 savePriceLabel.textColor=[UIColor redColor];
 //ADD THE LABEL TO CELLS CONTACT VIEW
 [cell.contentView addSubview:savePriceLabel];

 // Configure the product Image
 productImage = [[[UIImageView alloc]
 initWithFrame:CGRectMake(0.0, 0.0, 50.0, 60.0)]
 autorelease];
 productImage.tag = PRODUCTIMAGELABEL_TAG;
 // Add the Image to the cell’s content view
 [cell.contentView addSubview:productImage];
 //CONFIGURE THE VNAME LABEL
 vLabel=[[[UILabel alloc]initWithFrame:CGRectMake(60, 18, 50, 18)]autorelease];
 vLabel.tag=VLABEL_TAG;
 vLabel.font=[UIFont systemFontOfSize:12.0];
 //ADD THE LABEL TO CELLS CONTACT VIEW
 [cell.contentView addSubview:vLabel];
 //add button in table view cell...

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(0,0,50,60);
    [button setTag:indexPath.row+1];
    //[button setImage:[UIImage imageNamed:@"m1.png"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];
    button.backgroundColor = [UIColor clearColor];
    [cell.contentView addSubview:button];


 }

 else {
 nameLabel=(UILabel*)[cell.contentView viewWithTag:NAMELABEL_TAG];
 valueLabel=(UILabel*)[cell.contentView viewWithTag:VALUELABEL_TAG];
 myPriceLabel=(UILabel*)[cell.contentView viewWithTag:MYPRICELABEL_TAG];
 savePriceLabel=(UILabel*)[cell.contentView viewWithTag:SAVEPRICELABEL_TAG];
 productImage = (UIImageView *)[cell.contentView viewWithTag:PRODUCTIMAGELABEL_TAG];
 vLabel=(UILabel*)[cell.contentView viewWithTag:VLABEL_TAG];
 yLabel=(UILabel*)[cell.contentView viewWithTag:YLABEL_TAG];
 sLabel=(UILabel*)[cell.contentView viewWithTag:SLABEL_TAG];
 }


 // Configure the cell...
 //mohit code start

 Product *pro = [self.products objectAtIndex:[indexPath row]];
 nameLabel.text = pro.name;
 valueLabel.text=[[NSNumber numberWithDouble:pro.value]stringValue];
 myPriceLabel.text=[[NSNumber numberWithDouble:pro.price]stringValue];
 savePriceLabel.text=[[NSNumber numberWithDouble:(pro.value-pro.price)]stringValue];
 vLabel.text=@"value Rs:";
 yLabel.text=@"your Price Rs:";
 sLabel.text=@"you Save Rs:";
 NSString *filePath = [[NSBundle mainBundle] pathForResource:pro.image
 ofType:@"png"];
 UIImage *image = [UIImage imageWithContentsOfFile:filePath];
 productImage.image = image;
 //cell.detailTextLabel.text=pro.value;
 /* 
 NSString *filepath=[[NSBundle mainBundle]pathForResource:pro.image ofType:@"png"];
 UIImage *image=[UIImage imageWithContentsOfFile:filepath];
 cell.imageView.image=image;
 */ 
//mohit code finish

return cell;
}

4 个答案:

答案 0 :(得分:1)

您可以尝试为内容视图制作一个笔尖,并为该单元格设置布局。然后,您只需创建视图并分配值。您的一些重叠必须只是您为子视图创建的帧已关闭。 (用笔尖你可以看到并拖动东西)。但我不确定笔尖是否有助于提高性能。在我可以的时候,只是个人喜欢使用笔尖。

至于速度,你不会做任何看起来过于密集的事情。这个运行的设备是什么设备或运行速度慢的模拟器?你加载的图像有多大?看起来你正在使用可重复使用的单元但是你已经使用了调试器并检查以确保它不是每次都试图重新创建每个单元?如果是,那可能是可能的来源或您的性能问题。

答案 1 :(得分:1)

  1. 如果vLabel / yLabel / sLabel是常量,请在创建单元格时指定它。
  2. 使用[NSString stringWithFormat:@"%.2f", double]
  3. 将double转换为字符串
  4. 如果图片在你的包中,请尝试[UIImage imageNamed:@"path/to/your/image"],它会获得系统图片缓存以减少图片加载的延迟。

答案 2 :(得分:1)

我会寻找代码中其他地方发生的处理器密集型工作,因为您在这里看到的很多东西看起来很直接。查看其他类,看看你是否在主线程上做了昂贵的工作,因为这是最有可能的慢滚动源。你有另一个视图加载吗?是否在主线程上进行了一些网络或数据库查询?

答案 3 :(得分:1)

我同意在笔尖中创建单元格是可行的方法,但是如果你坚持以编程方式创建tableViewCells,那么我的建议就是加快速度:你的vLabel,yLabel和sLabel元素似乎是静态的因此只需要在首次创建单元格时设置(在“if(cell == nil)”部分内)。

此外,您的productImage似乎仅用作自定义按钮的背景,因为它们的框架重叠。我会设置自定义按钮的背景图像以获得相同的效果。此外,每当单元格需要显示时,产品的价格和价值都会转换为NSNumber,也许如果您在产品类中将它们存储为NSNumber,这可能有助于加快速度。最后,您似乎每次都从产品价值和价格计算savePriceLabel。如果这些值不太可能改变,那么在首次创建产品时计算savePrice可能是有利的。

我希望这些建议有所帮助。

此外,看起来您在第一次创建单元格时将按钮的标记设置为indexPath,但是当它被重用时,标记永远不会更新。如果您使用它来跟踪按下哪个单元格的按钮,那么这将使标记值不准确。