Линия не рисуется на всех uitableviewcells - PullRequest
1 голос
/ 20 февраля 2012

У меня есть табличное представление с пользовательской ячейкой (управляемой пользовательским классом, конечно), которая имеет следующую функцию drawRect: в пользовательском классе:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    CGRect busNumberFrame = busNumber.frame;

    NSLog(@"-----------------");
    NSLog(@"Line Origin X: %f", busNumberFrame.origin.x + busNumberFrame.size.width);
    NSLog(@"Line Origin Y: %f", self.frame.origin.y);
    NSLog(@"Line End X: %f", busNumberFrame.origin.x + busNumberFrame.size.width);
    NSLog(@"Line End Y: %f", self.frame.origin.y + self.frame.size.height);
    NSLog(@"-----------------");

    CGContextRef cgContext = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(cgContext, 0.0, 0.0, 0.0, 1.0);
    CGContextSetLineWidth(cgContext, 0.75);
    CGContextMoveToPoint(cgContext, busNumberFrame.origin.x + busNumberFrame.size.width, self.frame.origin.y);
    CGContextAddLineToPoint(cgContext, busNumberFrame.origin.x + busNumberFrame.size.width, self.frame.origin.y + self.frame.size.height);
    CGContextStrokePath(cgContext);
}

Это рисует линию от вершины ячейки до основания. Это успешно рисуется для первой ячейки, но последующие ячейки не показывают линию, которая должна быть нарисована. Вот код для cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    BusInfoTableViewCell *cell = (BusInfoTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Bus Route Cell"];

    Bus *bus = [self.fetchedResultsController objectAtIndexPath:indexPath];
    // Configure the cell...

    cell.busNumber.text = [bus.number stringValue];
    cell.firstStop.text = bus.departure;
    cell.lastStop.text = bus.arrival;
    [cell.contentView setNeedsDisplay];
    return cell;
}

А вот лог-вывод drawRect::

2012-02-21 19:35:08.840 ETA[2208:707] -----------------
2012-02-21 19:35:08.843 ETA[2208:707] Line Origin X: 79.000000
2012-02-21 19:35:08.843 ETA[2208:707] Line Origin Y: 0.000000
2012-02-21 19:35:08.844 ETA[2208:707] Line End X: 79.000000
2012-02-21 19:35:08.845 ETA[2208:707] Line End Y: 63.000000
2012-02-21 19:35:08.845 ETA[2208:707] -----------------
2012-02-21 19:35:08.850 ETA[2208:707] -----------------
2012-02-21 19:35:08.851 ETA[2208:707] Line Origin X: 79.000000
2012-02-21 19:35:08.852 ETA[2208:707] Line Origin Y: 63.000000
2012-02-21 19:35:08.852 ETA[2208:707] Line End X: 79.000000
2012-02-21 19:35:08.853 ETA[2208:707] Line End Y: 126.000000
2012-02-21 19:35:08.853 ETA[2208:707] -----------------
2012-02-21 19:35:08.857 ETA[2208:707] -----------------
2012-02-21 19:35:08.857 ETA[2208:707] Line Origin X: 79.000000
2012-02-21 19:35:08.858 ETA[2208:707] Line Origin Y: 126.000000
2012-02-21 19:35:08.859 ETA[2208:707] Line End X: 79.000000
2012-02-21 19:35:08.859 ETA[2208:707] Line End Y: 189.000000
2012-02-21 19:35:08.860 ETA[2208:707] -----------------

Я, вероятно, делаю что-то не так ...

Любая помощь приветствуется.

Заранее спасибо.

1 Ответ

3 голосов
/ 22 февраля 2012

Координаты являются локальными для ячейки, поэтому следует использовать следующее (все экземпляры self.frame должны быть self.bounds):

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    CGRect busNumberFrame = busNumber.frame;

    NSLog(@"-----------------");
    NSLog(@"Line Origin X: %f", busNumberFrame.origin.x + busNumberFrame.size.width);
    NSLog(@"Line Origin Y: %f", self.bounds.origin.y);
    NSLog(@"Line End X: %f", busNumberFrame.origin.x + busNumberFrame.size.width);
    NSLog(@"Line End Y: %f", self.bounds.origin.y + self.bounds.size.height);
    NSLog(@"-----------------");

    CGContextRef cgContext = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(cgContext, 0.0, 0.0, 0.0, 1.0);
    CGContextSetLineWidth(cgContext, 0.75);
    CGContextMoveToPoint(cgContext, busNumberFrame.origin.x + busNumberFrame.size.width, self.bounds.origin.y);
    CGContextAddLineToPoint(cgContext, busNumberFrame.origin.x + busNumberFrame.size.width, self.bounds.origin.y + self.bounds.size.height);
    CGContextStrokePath(cgContext);
}
...