在使用Core Graphics为网格添加垂直线时,在表视图中设置背景颜色

时间:2010-09-28 23:23:52

标签: iphone uitableview background-color cgcontext

我正在尝试使用UITableView创建网格样式表,方法是在UITableView中默认提供的标准水平线上覆盖垂直线。我正在根据此博客提供的示例调整我的代码:http://www.iphonedevx.com/?p=153

首先,绘制垂直线(与水平线颜色相同)的代码在与表视图控制器分开的文件中实现,称为“MyTableCell.m”:

- (void)drawRect:(CGRect)rect {
     CGContextRef ctx = UIGraphicsGetCurrentContext();
     // Use the same color and width as the default cell separator for now
     CGContextSetRGBStrokeColor(ctx, 0.5, 0.5, 0.5, 1.0);
     CGContextSetLineWidth(ctx, 0.25);

     for (int i = 0; i < [columns count]; i++) {
      CGFloat f = [((NSNumber*) [columns objectAtIndex:i]) floatValue];
      CGContextMoveToPoint(ctx, f, 0);
      CGContextAddLineToPoint(ctx, f, self.bounds.size.height);
     }

     CGContextStrokePath(ctx);

     [super drawRect:rect];
    }

接下来,在Table View Controller tableView方法中,我们调用[cell addColumn:50]在视图边界左侧绘制一个50像素的垂直线:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %i", indexPath.row];

 MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

 if (cell == nil) {
  cell = [[[MyTableCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];

  UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0, 30.0,
                 tableView.rowHeight)] autorelease];
  [cell addColumn:50];
  label.tag = LABEL_TAG;
  label.font = [UIFont systemFontOfSize:12.0];
  label.text = [NSString stringWithFormat:@"%d", indexPath.row];
  label.textAlignment = UITextAlignmentRight;
  label.textColor = [UIColor blueColor];
  label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin |
  UIViewAutoresizingFlexibleHeight;
  [cell.contentView addSubview:label]; 

  label =  [[[UILabel alloc] initWithFrame:CGRectMake(60.0, 0, 30.0,
               tableView.rowHeight)] autorelease];
  [cell addColumn:120];
  label.tag = VALUE_TAG;
  label.font = [UIFont systemFontOfSize:12.0];
  // add some silly value
  label.text = [NSString stringWithFormat:@"%d", indexPath.row * 4];
  label.textAlignment = UITextAlignmentRight;
  label.textColor = [UIColor blueColor];
  label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin |
  UIViewAutoresizingFlexibleHeight;
  [cell.contentView addSubview:label];
 }

 return cell;
}

我正在尝试将整个视图的背景从白色(默认)更改为黑色。我尝试通过在表视图控制器的viewDidLoad方法中将self.view.backgroundColor设置为黑色来执行此操作:

    - (void)viewDidLoad {
 self.view.backgroundColor = [UIColor blackColor];
}

但是,当我这样做时,垂直线会消失......

我认为以某种方式在viewDidLoad中设置backgroundColor会在我们到达drawRect:方法时更改CurrentContext,但我不知道如何调整它。我试过通过drawRect中的CGContextSetFillColorWithColor()设置背景颜色:像这样:

GContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(ctx, tableBackgroundColor());
CGContextFillRect(ctx, self.bounds);

其中tableBackgroundColor()是黑色的,如下所示:

    CGColorRef tableBackgroundColor()
{
 static CGColorRef c = NULL;
 if(c == NULL)
 {
  c = CreateDeviceRGBColor(0.0, 0.0, 0.0, 1.0); // black
 }
 return c;
}

CGColorRef CreateDeviceRGBColor(CGFloat r, CGFloat g, CGFloat b, CGFloat a)
{
 CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
 CGFloat comps[] = {r, g, b, a};
 CGColorRef color = CGColorCreate(rgb, comps);
 CGColorSpaceRelease(rgb);
 return color;
}

但是,只要我尝试使用此方法更改背景颜色,垂直线仍会被消除。我在这里错过了什么?

任何想法都会提前得到赞赏!

2 个答案:

答案 0 :(得分:0)

看起来很奇怪,但也许是drawRect的默认实现:绘制背景颜色。尝试将[super drawRect:rect]移至开头。

答案 1 :(得分:0)

你确定它们正在消失,或者你在黑色背景上看不到浅灰色线条吗?

在drawRect中:我改变了

 CGContextSetRGBStrokeColor(ctx, 0.5, 0.5, 0.5, 1.0);
 CGContextSetLineWidth(ctx, 0.25);

CGContextSetRGBStrokeColor(ctx, 0.0, 0.0, 0.0, 1.0);
CGContextSetLineWidth(ctx, 10.0);

在viewDidLoad中,我使用了[UIColor yellowColor];并且线条看起来很好。 (我还打电话给[super viewDidLoad],但删除它没有任何区别。)