UITableViewCell具有自定义渐变背景,另一个渐变为高亮颜色

时间:2010-04-14 02:44:43

标签: iphone objective-c uitableview

我有一个带有自定义布局的自定义UITableViewCell。我想要一个渐变背景,所以在我的UITableViewDelegate cellForRowAtIndexPath:方法中,我创建了一个CAGradientLayer并使用insertSubLayer:atIndex:将其添加到单元格的图层中(使用索引0)。除了两件事之外,这很好用:

最重要的是,当突出显示行时,我无法弄清楚如何更改为不同的渐变颜色。我尝试了几件事,但我对框架不够熟悉,无法让它发挥作用。在表委托或单元本身内放置代码的理想位置在哪里?

此外,表格中每个单元格之间有1px的空白区域。我在主视图上有背景颜色,桌面上有背景颜色,单元格上有背景颜色。在UITableView中默认是否有某种填充或间隔?

3 个答案:

答案 0 :(得分:19)

我知道这个帖子已经过时了,但是这里是问题第一部分的解决方案(向单元格的选定状态和非选定状态添加渐变):

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{    
    [cell setBackgroundColor:[UIColor clearColor]];

    CAGradientLayer *grad = [CAGradientLayer layer];
    grad.frame = cell.bounds;
    grad.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil];

    [cell setBackgroundView:[[UIView alloc] init]];
    [cell.backgroundView.layer insertSublayer:grad atIndex:0];

    CAGradientLayer *selectedGrad = [CAGradientLayer layer];
    selectedGrad.frame = cell.bounds;
    selectedGrad.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];

    [cell setSelectedBackgroundView:[[UIView alloc] init]];
    [cell.selectedBackgroundView.layer insertSublayer:selectedGrad atIndex:0];
}

答案 1 :(得分:2)

我不确定第一个问题,但我认为您可以设置selectedBackgroundView属性,与设置backgroundView属性的方式类似。单元格之间的空白区域可能是分隔符。你可以改变那种颜色,如

tableView.separatorColor = [UIColor redColor];

答案 2 :(得分:2)

我挣扎了几天。解决方案最终非常简单,但拼图的各个部分分布在几个不同的答案和网站上。这个难题的缺失部分被证明是内容视图和背景视图之间的区别以及应用选择颜色的位置。

我的解决方案的特点:

  • 我从笔尖加载我的单元格,以便我可以在IB中布局内容。随意以编程方式布置内容。
  • 我从全局样式对象中抓取渐变颜色,因为我需要按客户端自定义渐变。
    • 我在笔尖中将单元格的选择颜色设置为灰色,因此默认(蓝色)不会与我的配色方案冲突。
  • 我将渐变添加到背景视图中。如果不这样做,选择颜色将无法正确显示。 UITableViewCell默认没有背景视图,因此您必须先创建它。

最后一点是使这一切对我有用的秘密成分。

我在我的UITableCellView子类中添加了一个工厂方法,因为我想在多个表中使用相同的单元格。

+(ActivityDetailCellView *) createWithStyle: (WMStyle *) style {  
  UIViewController *temporaryController = [[UIViewController alloc] 
       initWithNibName: @"ActivityDetailCellView"
       bundle: nil];

  ActivityDetailCellView *cell = (ActivityDetailCellView *) temporaryController.view;

  CAGradientLayer *lightGradient = [CAGradientLayer layer];
  lightGradient.frame = cell.bounds;
  lightGradient.colors = style.lightGradient;

  UIView *background = [[UIView alloc] initWithFrame: cell.bounds];
  [background.layer insertSublayer:lightGradient atIndex:0];  
  cell.backgroundView = background;

  return cell;
}