设置 UITableViewCell 的背景视图 - 哪种方式更好?

Posted

技术标签:

【中文标题】设置 UITableViewCell 的背景视图 - 哪种方式更好?【英文标题】:Setting UITableViewCell's background view - which way is better? 【发布时间】:2012-06-21 21:15:44 【问题描述】:

我一直在 cellForRowAtIndexPath 调用中设置 UITableViewCell 的背景,如下所示:

CustomCell *cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier:simple];

if (cell == nil)

    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];

    for (id findCell in nib )
    
        if ( [findCell isKindOfClass: [CustomCell class]])
        
            cell = findCell;
            
    

    UIView *cellBackView = [[UIView alloc] initWithFrame:CGRectZero];
    UIView *cellSelectedBackView = [[UIView alloc] initWithFrame:CGRectZero];

    if (UIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()) 

        cellBackView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"cell_shadows_ipad_light.png"]];
        cellSelectedBackView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"blue_cell.png"]];
    else 
        cellBackView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"cell_shadows.png"]];
        cellSelectedBackView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"blue_cell.png"]];
    

    cell.backgroundView = cellBackView;
    cell.selectedBackgroundView = cellSelectedBackView;

现在我发现还有另一种方法可以实现这一点,那就是在这个委托中设置背景视图:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
   // load the background image and set it as the background color as above

ios5 开始,你可以只用 tableView 注册 nib,所以我也不需要循环查找类 nib。所以,在 viewDidLoad 中:

[self.tableView registerNib:[UINib nibWithNibName: @"CustomCellSplit" bundle:nil] forCellReuseIdentifier: @"CustomCellId"];

所以这行得通,它更简单,它是苹果推荐的加载单元格笔尖和设置背景视图的方式。但是,我发现当您滚动列表时,每行都会调用这个 tableView: willDisplayCell: forRowAtIndexPath 。使用我之前加载背景视图的方式,它只会在创建单元格时设置背景视图(最多 8 或 10 次)。

因此,新方法听起来像是加载单元格和设置背景视图的性能较差的方法。这是正确的假设,还是我在这里遗漏了什么?

【问题讨论】:

【参考方案1】:

事实证明这真的很简单。您只需在 nib 中添加一个子视图并将其连接到 UITableViewCell 中的selectedBackgroundView 插座。

http://cl.ly/image/322L2k3j2U1A

瞧。

iOS5 足够聪明,可以在运行时从单元格的 contentView 中移除 backgroundView。

无需使用tableView:willDisplayCell函数。

【讨论】:

以上是关于设置 UITableViewCell 的背景视图 - 哪种方式更好?的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell未选中时如何将其背景视图设置为选中的背景?

在普通样式表视图上设置 UITableViewCell 背景颜色?

UITableViewCell 上的背景视图在使用切片 xcasset 时拥抱内容

uitableviewcell 自定义背景问题

自定义 UITableViewCell 背景,何时重新加载等

不在 UITableView 中时如何设置 UITableViewCell 的选定背景颜色