Ios 在带子视图的UITableView中滚动时,性能非常差
我只是不明白这里发生了什么 我有一个UITableView,其中每个单元格都包含一些子视图,它可以正常工作。不幸的是,性能是可怕的,滚动只是方式太不稳定。我了解到,也许您可以将UITableViewCell子类化,这有助于提高性能,但我不确定如何实现这一点或实现另一个解决方案来解决这个问题。 我已经在下面发布了tableView的委托方法,如有任何帮助,将不胜感激Ios 在带子视图的UITableView中滚动时,性能非常差,ios,xcode,uitableview,subview,Ios,Xcode,Uitableview,Subview,我只是不明白这里发生了什么 我有一个UITableView,其中每个单元格都包含一些子视图,它可以正常工作。不幸的是,性能是可怕的,滚动只是方式太不稳定。我了解到,也许您可以将UITableViewCell子类化,这有助于提高性能,但我不确定如何实现这一点或实现另一个解决方案来解决这个问题。 我已经在下面发布了tableView的委托方法,如有任何帮助,将不胜感激 - (UITableViewCell *)tableView:(UITableView *)tableView cellF
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UIImageView* imageView;
UILabel* ttitle;
UILabel* ttitle2;
UILabel* ttitle3;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
// Configure cell:
// *** This section should configure the cell to a state independent of
// whatever row or section the cell is in, since it is only executed
// once when the cell is first created.
imageView=[[UIImageView alloc]initWithFrame:CGRectMake(10.0, 11.0, 50.0, 50.0)];
[imageView setContentMode:UIViewContentModeScaleAspectFill];
imageView.layer.masksToBounds=YES;
imageView.layer.cornerRadius=5.0;
imageView.tag=1;
[cell.contentView addSubview:imageView];
ttitle = [[[UILabel alloc] initWithFrame:CGRectMake(70.0, 7.0, 200, 20)] autorelease];
ttitle.textColor= [UIColor blackColor];
ttitle.numberOfLines=1;
ttitle.tag=69;
ttitle.backgroundColor=[UIColor clearColor];
ttitle.font=[UIFont fontWithName:@"Arial Bold" size:15.0];
[cell.contentView addSubview:ttitle];
if (indexPath.row==0) {
CGSize size=[[[data objectAtIndex:indexPath.row] valueForKey:@"content"] sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(265.0f, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
ttitle2 = [[[UILabel alloc] initWithFrame:CGRectMake(70.0, 27.5, 200, size.height)] autorelease];
ttitle2.textColor= [UIColor darkGrayColor];
ttitle2.backgroundColor=[UIColor clearColor];
ttitle2.numberOfLines=0;
ttitle2.tag=70;
ttitle2.textAlignment = NSTextAlignmentLeft;
ttitle2.lineBreakMode=NSLineBreakByWordWrapping;
ttitle2.font=[UIFont fontWithName:@"Arial" size:14.0];
[cell.contentView addSubview:ttitle2];
ttitle3 = [[[UILabel alloc] initWithFrame:CGRectMake(70.0, ttitle2.frame.origin.y+ttitle2.frame.size.height-8.0, 210, 40)] autorelease];
ttitle3.textColor= [UIColor darkGrayColor];
ttitle3.backgroundColor=[UIColor clearColor];
ttitle3.numberOfLines=1;
ttitle3.tag=71;
ttitle3.textAlignment = NSTextAlignmentLeft;
ttitle3.lineBreakMode=NSLineBreakByWordWrapping;
ttitle3.font=[UIFont fontWithName:@"Arial" size:11.0];
[cell.contentView addSubview:ttitle3];
}
else{
CGSize size=[[[data objectAtIndex:indexPath.row] valueForKey:@"content"] sizeWithFont:[UIFont systemFontOfSize:14.0f] constrainedToSize:CGSizeMake(265.0f, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
ttitle2 = [[[UILabel alloc] initWithFrame:CGRectMake(70.0, 27.0, 200, size.height)] autorelease];
ttitle2.textColor= [UIColor darkGrayColor];
ttitle2.backgroundColor=[UIColor clearColor];
ttitle2.numberOfLines=0;
ttitle2.tag=70;
ttitle2.textAlignment = NSTextAlignmentLeft;
ttitle2.lineBreakMode=NSLineBreakByWordWrapping;
ttitle2.font=[UIFont fontWithName:@"Arial" size:14.0];
[cell.contentView addSubview:ttitle2];
ttitle3 = [[[UILabel alloc] initWithFrame:CGRectMake(70.0, ttitle2.frame.origin.y+ttitle2.frame.size.height-9.0, 210, 40)] autorelease];
ttitle3.textColor= [UIColor darkGrayColor];
ttitle3.backgroundColor=[UIColor clearColor];
ttitle3.numberOfLines=1;
ttitle3.tag=71;
ttitle3.textAlignment = NSTextAlignmentLeft;
ttitle3.lineBreakMode=NSLineBreakByWordWrapping;
ttitle3.font=[UIFont fontWithName:@"Arial" size:11.0];
[cell.contentView addSubview:ttitle3];
}
}
else {
imageView = (UIImageView *) [cell viewWithTag:1];
ttitle=( UILabel *) [cell viewWithTag:69];
ttitle2=( UILabel *) [cell viewWithTag:70];
ttitle3=( UILabel *) [cell viewWithTag:71];
}
//STUFFOUTSIDE
// Customize cell:
// *** This section should customize the cell depending on what row or section
// is passed in indexPath, since this is executed every time this delegate method
// is called.
imageView.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[[data objectAtIndex:indexPath.row] valueForKey:@"thumbnail"]]]];
[ttitle setText:[[data objectAtIndex:indexPath.row] valueForKey:@"name"]];
[ttitle2 setText:[[data objectAtIndex:indexPath.row] valueForKey:@"content"]];
NSString* first=[[[data objectAtIndex:indexPath.row] valueForKey:@"hashtag"] stringByAppendingString:@" "];
NSString* second =[first stringByAppendingString:[[data objectAtIndex:indexPath.row] valueForKey:@"place"]];
NSString* third=[second stringByAppendingString:@" "];
NSString* fourth=[third stringByAppendingString:@"¤ "];
NSString* conversion=[[[data objectAtIndex:indexPath.row] valueForKey:@"counter"] stringValue];
NSString* fifth=[fourth stringByAppendingString:conversion];
[ttitle3 setText:fifth];
return cell;
}有很多问题会导致滞后,但我认为在这种情况下有三个可能的原因:
有很多问题可能导致滞后,但我认为在这种情况下有三个可能的原因:
您正在从URL同步获取数据,以获取每个单元格的图像。这意味着,在从internet获取数据之前,每个单元格都会阻塞主线程 您必须在后台线程上异步加载图像,并在加载图像时更新单元格。关于这一点,有很多博客文章 更新:
无法判断图像URL是否为本地URL,但我假设它是远程URL,并且图像未存储在应用程序中。您正在从URL同步获取数据,以获取每个单元格的图像。这意味着,在从internet获取数据之前,每个单元格都会阻塞主线程 您必须在后台线程上异步加载图像,并在加载图像时更新单元格。关于这一点,有很多博客文章 更新:
无法判断图像URL是否为本地URL,但我假设它是远程URL,并且图像未存储在应用程序中。这不是造成延迟的主要原因,但当您在顶部附近创建UIImageView时,您正在泄漏UIImageView。有自动释放调用,所以你知道这不是ARC。我一直不明白为什么要创建继承的
UITableViewCell
类而不是添加许多常规子视图并通过编程逐个调整它们的属性更难。。。从nib加载视图可以非常快,并且在IB中很容易维护。这不是导致延迟的主要原因,但在顶部附近创建UIImageView时,会泄漏UIImageView。有自动释放调用,所以你知道这不是ARC。我一直不明白为什么要创建继承的UITableViewCell
类而不是添加许多常规子视图并通过编程逐个调整它们的属性更难。。。从nib加载视图可能非常快,并且在IB中维护非常容易。无论图像大小如何,从web同步加载它们总是非常非常慢。;)@法比安克雷瑟:没错,如果他们来自网络@法比安克雷瑟:而且,如果我读了那部分代码,我会看到他是,哈哈。谢谢!无论图像大小如何,从web同步加载图像总是非常非常慢@法比安克雷瑟:没错,如果他们来自网络@法比安克雷瑟:而且,如果我读了那部分代码,我会看到他是,哈哈。谢谢+1号护卫舰也有一些优点,但这几乎肯定是大部分的滞后。即使URL是本地的,并且您正在从磁盘获取,这对于配置表视图单元格来说也太慢了。您是对的,它们是远程的。因此,我希望用ansyc分派填充tableView,并简单地让所有子视图分配都发生在其中。这是正确的方法吗?@RobNapier:FYI,我有一个应用程序,如果文件是本地的并且同步加载,那么它的滚动性能非常好,只要它们在分配给图像视图时不需要缩放。事实上,我对它的效果感到惊讶,lol.+1护卫舰也有一些优点,但这几乎肯定是大部分的滞后。即使URL是loc