将UIViews添加到cell.contentView时,UITableView性能问题 [英] UITableView performance issues when adding UIViews to cell.contentView
问题描述
在我的 UITableViewCells
上使用某些子视图时,我遇到性能问题.在我不断滚动之后,它最终开始变得非常缓慢.
我要做的第一步是为每个单元格创建一个通用的 UIView
,从本质上讲,这是在白色单元格上创建一个带有阴影的圆形效果的白色单元格.这样做的性能似乎很正常,所以我不认为这是罪魁祸首.
这是我用来执行此操作的代码:
<代码>-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{静态NSString * NewsCellIdentifer = @"NewsCellIdentifier";NewsItem * item = [self.newsArray objectAtIndex:indexPath.row];UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NewsCellIdentifer];如果(cell == nil){单元格= [[UITableViewCell分配] initWithStyle:UITableViewCellStyleDefault重用标识符:NewsCellIdentifer];cell.contentView.backgroundColor = [UIColor clearColor];UIView * whiteRoundedCornerView = [[UIView alloc] initWithFrame:CGRectMake(10,10,300,100)];whiteRoundedCornerView.backgroundColor = [UIColor whiteColor];whiteRoundedCornerView.layer.masksToBounds = NO;whiteRoundedCornerView.layer.cornerRadius = 3.0;whiteRoundedCornerView.layer.shadowOffset = CGSizeMake(-1,1);whiteRoundedCornerView.layer.shadowOpacity = 0.5;[cell.contentView addSubview:whiteRoundedCornerView];[cell.contentView sendSubviewToBack:whiteRoundedCornerView];cell.layer.shouldRasterize = YES;cell.layer.rasterizationScale = [UIScreen mainScreen] .scale;cell.layer.opaque = YES;cell.opaque = YES;}[cell.contentView addSubview:[self NewsItemThumbnailView:item]];返回单元}
以下是返回图形和文本的缩略图视图的方法:
-(UIView *)NewsItemThumbnailView:(NewsItem *)项目{UIView * thumbNailMainView = [[UIView alloc] initWithFrame:CGRectMake(10,10,50,70)];UIImageView * thumbNail = [[UIImageView分配] initWithImage:[UIImage imageNamed:item.ThumbNailFileName]];thumbNail.frame = CGRectMake(10,10,45,45);UILabel * date = [[UILabel alloc] init];date.frame = CGRectMake(10,53,45,12);date.text = item.ShortDateString;date.textAlignment = NSTextAlignmentCenter;date.textColor = [BVColors WebDarkGrey];CGFloat fontSize = 10.0;date.font = [BVFont Museo:& fontSize];date.opaque =是;thumbNail.opaque =是;thumbNailMainView.opaque = YES;[thumbNailMainView addSubview:thumbNail];[thumbNailMainView addSubview:date];返回thumbNailMainView;}
性能问题似乎是当我将缩略图视图添加到单元格时,因为当我注释掉该行时,我似乎没有它.缩略图信息是动态的,并且会随每个单元格而变化.对于在不降低性能的情况下应如何操作的任何建议,我将不胜感激.
我最终利用了在以下stackoverflow帖子中找到的解决方案:
如何将Subview添加到cell.contentView? >
基本上,当第一次初始化单元格时,我将按照Nishant的说明设置视图;但是,一旦单元被重用,我将提取需要更改的项目,例如UIImageView和UILabel.由于这些是指针,因此我可以在需要时修改自己需要的内容,并且性能又很快.这是我所做的缩写.
<代码>-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{静态NSString * NewsCellIdentifer = @"NewsCellIdentifier";NewsItem * item = [self.newsArray objectAtIndex:indexPath.row];UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NewsCellIdentifer];UIView * thumbNailMainView = [[UIView alloc] initWithFrame:CGRectMake(10,10,50,70)];UIImageView * thumbNail;UIView * textMainView = [[UIView分配] initWithFrame:CGRectMake(20,20,80,80)];UILabel * headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(52,-5,70,20)];UILabel * teaserLabel = [[UILabel alloc] initWithFrame:CGRectMake(50,20,210,40)];UIView * newsItemCornerMainView = [[UIView alloc] initWithFrame:CGRectMake(255.7,55.2,55,55)];UIImageView * cornerIconView;//如果该单元格不存在,则将其重新设置.如果(cell == nil){单元格= [[UITableViewCell分配] initWithStyle:UITableViewCellStyleDefault重用标识符:NewsCellIdentifer];//配置所有各种子视图.....//下面的示例//制作标题视图headerLabel.text = item.Title;CGFloat textfontSize = 16.0f;headerLabel.font = [BVFont Museo:& textfontSize];headerLabel.textColor = [BVColors WebBlue];headerLabel.textAlignment = NSTextAlignmentLeft;headerLabel.numberOfLines = 0;headerLabel.tag = 50;//制作预告片视图teaserLabel.text = item.Teaser;teaserLabel.numberOfLines = 0;CGFloat tfontSize = 13.0f;teaserLabel.textAlignment = NSTextAlignmentLeft;teaserLabel.textColor = [BVColors WebDarkGrey];teaserLabel.font = [BVFont HelveticaNeue:& tfontSize];[teaserLabel sizeToFit];teaserLabel.tag = 51;[textMainView addSubview:headerLabel];[textMainView sendSubviewToBack:headerLabel];[textMainView addSubview:teaserLabel];[cell.contentView addSubview:textMainView];....}thumbNail =(UIImageView *)[cell viewWithTag:47];[thumbNail setImage:[UIImage imageNamed:item.ThumbNailFileName]];headerLabel =(UILabel *)[cell viewWithTag:50];headerLabel.text = item.Title;teaserLabel =(UILabel *)[cell viewWithTag:51];teaserLabel.text = item.Teaser;cornerIconView =(UIImageView *)[cell viewWithTag:48];[cornerIconView setImage:[UIImage imageNamed:item.CornerIconFileName]];返回单元}
I am experiencing performance problems when using some subviews on my UITableViewCells
. After I keep scrolling it eventually starts getting very slow.
First step I am doing is creating a common UIView
for every cell, essentially this is creating a white cell with a rounded effect on the cell with a shadow. The performance for this seems to be normal so I don't think it's the culprit.
Here is the code I am using to do this:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *NewsCellIdentifer = @"NewsCellIdentifier";
NewsItem *item = [self.newsArray objectAtIndex:indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NewsCellIdentifer];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NewsCellIdentifer];
cell.contentView.backgroundColor = [UIColor clearColor];
UIView *whiteRoundedCornerView = [[UIView alloc] initWithFrame:CGRectMake(10,10,300,100)];
whiteRoundedCornerView.backgroundColor = [UIColor whiteColor];
whiteRoundedCornerView.layer.masksToBounds = NO;
whiteRoundedCornerView.layer.cornerRadius = 3.0;
whiteRoundedCornerView.layer.shadowOffset = CGSizeMake(-1, 1);
whiteRoundedCornerView.layer.shadowOpacity = 0.5;
[cell.contentView addSubview:whiteRoundedCornerView];
[cell.contentView sendSubviewToBack:whiteRoundedCornerView];
cell.layer.shouldRasterize = YES;
cell.layer.rasterizationScale = [UIScreen mainScreen].scale;
cell.layer.opaque = YES;
cell.opaque = YES;
}
[cell.contentView addSubview:[self NewsItemThumbnailView:item]];
return cell;
}
Here is the method that returns the thumbnail view of the graphic and text:
- (UIView *) NewsItemThumbnailView:(NewsItem *)item
{
UIView *thumbNailMainView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 50, 70)];
UIImageView *thumbNail = [[UIImageView alloc] initWithImage:[UIImage imageNamed:item.ThumbNailFileName]];
thumbNail.frame = CGRectMake(10,10, 45, 45);
UILabel *date = [[UILabel alloc] init];
date.frame = CGRectMake(10, 53, 45, 12);
date.text = item.ShortDateString;
date.textAlignment = NSTextAlignmentCenter;
date.textColor = [BVColors WebDarkGrey];
CGFloat fontSize = 10.0;
date.font = [BVFont Museo:&fontSize];
date.opaque = YES;
thumbNail.opaque = YES;
thumbNailMainView.opaque = YES;
[thumbNailMainView addSubview:thumbNail];
[thumbNailMainView addSubview:date];
return thumbNailMainView;
}
The performance problem seems to be when I add the thumbnail view to the cell because when I comment that line out, I don't seem to have it. The thumbnail information is dynamic and will change with each cell. I would appreciate any advice on how I should do this without degrading the performance.
I ended up leveraging a solution found on this stackoverflow post:
How should I addSubview to cell.contentView?
Essentially when the cell is first initialized I am setting the view as mentioned by Nishant; however once the cell is reused I am extracting out the items I need to change, such as an UIImageView and then a UILabel. Since these are pointers I can modify just what I need when I need to and the performance is fast again. Here is a abbreviated version of what I did.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *NewsCellIdentifer = @"NewsCellIdentifier";
NewsItem *item = [self.newsArray objectAtIndex:indexPath.row];
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NewsCellIdentifer];
UIView *thumbNailMainView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 50, 70)];
UIImageView *thumbNail;
UIView *textMainView = [[UIView alloc] initWithFrame:CGRectMake(20,20,80,80)];
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(52,-5, 70, 20)];
UILabel *teaserLabel = [[UILabel alloc] initWithFrame:CGRectMake(50,20, 210, 40)];
UIView *newsItemCornerMainView = [[UIView alloc] initWithFrame:CGRectMake(255.7, 55.2, 55, 55)];
UIImageView *cornerIconView;
// If the cell doesn't existing go ahead and make it fresh.
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NewsCellIdentifer];
// Configure all the various subviews
..... //Sample below
// Make the title view
headerLabel.text = item.Title;
CGFloat textfontSize = 16.0f;
headerLabel.font = [BVFont Museo:&textfontSize];
headerLabel.textColor = [BVColors WebBlue];
headerLabel.textAlignment = NSTextAlignmentLeft;
headerLabel.numberOfLines = 0;
headerLabel.tag = 50;
// Make the Teaser view
teaserLabel.text = item.Teaser;
teaserLabel.numberOfLines = 0;
CGFloat tfontSize = 13.0f;
teaserLabel.textAlignment = NSTextAlignmentLeft;
teaserLabel.textColor = [BVColors WebDarkGrey];
teaserLabel.font = [BVFont HelveticaNeue:&tfontSize];
[teaserLabel sizeToFit];
teaserLabel.tag = 51;
[textMainView addSubview:headerLabel];
[textMainView sendSubviewToBack:headerLabel];
[textMainView addSubview:teaserLabel];
[cell.contentView addSubview:textMainView];
....
}
thumbNail = (UIImageView *) [cell viewWithTag:47];
[thumbNail setImage:[UIImage imageNamed:item.ThumbNailFileName]];
headerLabel = (UILabel *) [cell viewWithTag:50];
headerLabel.text = item.Title;
teaserLabel = (UILabel *) [cell viewWithTag:51];
teaserLabel.text = item.Teaser;
cornerIconView = (UIImageView *) [cell viewWithTag:48];
[cornerIconView setImage:[UIImage imageNamed:item.CornerIconFileName]];
return cell;
}
这篇关于将UIViews添加到cell.contentView时,UITableView性能问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!