Установите цвет фона в табличном представлении при использовании Core Graphics, чтобы добавить вертикальные линии для сетки - PullRequest
1 голос
/ 29 сентября 2010

Я пытаюсь создать таблицу в виде сетки, используя 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];
    }

Далее, в методе 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;
}

Я пытаюсь изменить фон всего вида с белого (по умолчанию) на черный.Я пытаюсь сделать это, установив self.view.backgroundColor в черный цвет в методе viewDidLoad контроллера табличного представления:

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

Однако, когда я делаю это, вертикальные линии исчезают ...

Я думаю, что каким-то образом установка backgroundColor в viewDidLoad изменяет CurrentContext к тому времени, когда мы получим метод drawRect:, но я не знаю, как это отрегулировать.Я попытался установить цвет фона с помощью CGContextSetFillColorWithColor () внутри drawRect: вот так:

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 голосов
/ 29 сентября 2010

Вы уверены, что они исчезают или что вы не видите светло-серую линию поверх черного фона?

В 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], но удаление его не имело никакого значения.)

0 голосов
/ 29 сентября 2010

Это кажется странным, но, возможно, реализация по умолчанию drawRect: рисует цвет фона.Попробуйте переместить [super drawRect:rect] в начало.

...