Нарисуйте CGImage в UITableView

Итак, у меня есть пользовательская ячейка, и мне нужно нарисовать все изображения как CGImage в tableView, но я не могу заставить ее работать. Я создал тестовый проект и протестировал код с простыми представлениями. Все работало идеально, и когда я скопировал тот же код в свою пользовательскую ячейку, он перестал работать. Вот код:

-(void)drawRect:(CGRect)rect {
    CGRect contentRect = self.contentView.bounds;
    CGFloat boundsX = contentRect.origin.x;

    UIImage *karmaImage = [UIImage imageNamed:@"karma.png"];
    [self drawImage:karmaImage withRect:CGRectMake(boundsX + 255, 16, 14, 14)];
}
-(void)drawImage:(UIImage *)image withRect:(CGRect)rect {
    CGImageRef imageRef = CGImageRetain(image.CGImage);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0, rect.size.height);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawImage(context, rect, imageRef);
}

Любые решения?


person Paul Semionov    schedule 01.09.2011    source источник


Ответы (3)


Apple рекомендует добавить собственное представление в contentView UITableViewCell вместо изменения самого UITableViewCell. См. TimeZoneCell для примера.

person mackworth    schedule 01.09.2011
comment
+1 Вы никогда не должны пытаться переопределить рисунок для самого UITableViewCell. Вы будете ломать все виды вещей. - person Rob Napier; 02.09.2011

В вашем методе drawRect вам, вероятно, следует вызвать [super drawRect:rect];

person picciano    schedule 01.09.2011

Хорошо, проблема заключалась в том, что contentView ячейки с пользовательским цветом фона скрывал изображение. Вот правильный код:

-(void) drawRect:(CGRect)rect{
    [super drawRect:rect];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [UIColor colorWithRed:(232.0/255.0) green:(232.0/255.0) blue:(232.0/255.0) alpha:1.0].CGColor);
    CGContextFillRect(context, rect);
    UIImage *karmaImg = [UIImage imageNamed:@"karma.png"]; 
    [self drawImage:karmaImg withContext:context atPoint:CGPointMake(boundsX + 255, 16)];
}


-(void)drawImage:(UIImage *)image withContext:(CGContextRef)context atPoint:(CGPoint)point {
    if(image) {
        CGContextDrawImage(context, CGRectMake(point.x, point.y, image.size.width, image.size.height), image.CGImage);
    } else {
        NSLog(@"Error: Image failed to load.");
    }
}
person Paul Semionov    schedule 02.09.2011
comment
Мне любопытно; почему бы просто не нарисовать изображение в uiImageView один раз, когда вы создаете ячейку (или даже только один раз для всех ячеек) и добавить это в contentView, а не перезагружать/отрисовывать его каждый раз, когда появляется ячейка. Казалось бы, чище и быстрее. - person mackworth; 02.09.2011