gpt4 book ai didi

iphone - 将 UIView 添加到 cell.contentView 时出现 UITableView 性能问题

转载 作者:可可西里 更新时间:2023-11-01 05:13:28 27 4
gpt4 key购买 nike

在我的 UITableViewCells 上使用某些 subview 时,我遇到了性能问题。在我继续滚动之后,它最终开始变得非常慢。

我做的第一步是为每个单元格创建一个通用的 UIView,本质上这是创建一个白色单元格,在带有阴影的单元格上具有圆形效果。这方面的表现似乎很正常,所以我不认为这是罪魁祸首。

enter image description here

这是我用来执行此操作的代码:

- (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;
}

返回图文缩略图的方法如下:

- (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;
}

性能问题似乎是当我将缩略图 View 添加到单元格时,因为当我注释掉该行时,我似乎没有它。缩略图信息是动态的,会随着每个单元格的变化而变化。对于如何在不降低性能的情况下执行此操作的任何建议,我将不胜感激。

最佳答案

UITableView 将在每次单元格进入 View 时调用 tableView:cellForRowAtIndexPath:,并且 dequeueReusableCellWithIdentifier: 将重用现有的单元格对象,如果它们是可用的。这两个事实结合起来使您处于这样一种情况:每次滚动时,同样有限数量的单元格对象最终会出现越来越多的 subview 。

正确的方法是创建一个自定义的 UITableViewCell 子类,它具有 thumbnailView 的属性。在该属性的 setter 中,删除之前的缩略图(如果有),然后将新缩略图添加到 contentView。这确保您在任何时候都只有一个缩略图 subview 。

一个不太理想的方法是向 NewsItemThumbnailView 返回的 UIView 添加一个标签 (thumbNailMainView.tag = someIntegerConstant),然后搜索任何带有该标签的 View 并在添加另一个之前将其删除:

 // remove old view
UIView *oldThumbnailView = [cell.contentView viewWithTag:someIntegerConstant];
[oldThumbnailView removeFromSuperview];

// add new view
[cell.contentView addSubview:[self NewsItemThumbnailView:item]];

关于iphone - 将 UIView 添加到 cell.contentView 时出现 UITableView 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16366596/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com