Недопустимый контекст 0x0

У меня есть этот метод -drawRect внутри представления:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 1.0);
for (int i=0; i<[points count]; i++) {
    GraphPoint* point = [points objectAtIndex:i];
    [point.color setFill];
    [[UIColor blackColor] setStroke];
    CGContextBeginPath(context);
    CGContextAddArc(context, point.x+point.size/2, point.y+point.size/2, point.size, 0, 2*M_PI, 0);
    CGContextFillPath(context);
    CGContextStrokePath(context);
    UIGraphicsPopContext();
}

При [points count] равном 1 все работает изумительно, однако при увеличении вылетает вот такая ошибка:

Error>: CGContextSetStrokeColorWithColor: invalid context 0x0.

Я думаю, что что-то не так с циклом - он устанавливает цвет контекста дважды или даже больше раз. Не знаю, как этого избежать. Каждая точка должна иметь свой цвет, и я не могу установить цвет заливки контекста перед циклом.

Пожалуйста помоги! Может кто-то когда-нибудь сталкивался с этой проблемой?


person Vlad Fedoseev    schedule 13.08.2012    source источник
comment
Почему вы выталкиваете контекст, когда вы его не нажимаете?   -  person jscs    schedule 13.08.2012


Ответы (2)


Вы неправильно понимаете, что делает UIGraphicsPopContext. Я предполагаю, что вы пытаетесь очистить текущий путь, установленный в контексте. Вы хотите CGContextSaveGState и CGContextRestoreGState.

Попробуй это:

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 1.0);
for (int i=0; i<[points count]; i++) {
    CGContextSaveGState(context);
    {
        GraphPoint* point = [points objectAtIndex:i];
        [point.color setFill];
        [[UIColor blackColor] setStroke];
        CGContextBeginPath(context);
        CGContextAddArc(context, point.x+point.size/2, point.y+point.size/2, point.size, 0, 2*M_PI, 0);
        CGContextFillPath(context);
        CGContextStrokePath(context);
    }
    CGContextRestoreGState(context);
}

Н.Б. Обычно я создаю новую область (с дополнительными { и }) при использовании операций на основе стека (push и pop), просто чтобы было легко проверить их сбалансированность. Это необязательно, конечно.

person joerick    schedule 13.08.2012
comment
Хороший совет по использованию скобок с программированием в стиле push и pop. - person Cthutu; 13.08.2012

Вы выталкиваете контекст в каждом цикле, но не нажимаете его. Итак, у вас заканчиваются контексты в стеке контекстов.

Удалите вызов UIGraphicsPopContext и посмотрите, исправит ли он это.

person Cthutu    schedule 13.08.2012
comment
Ооо! Проблема решена! Мне просто нужно было сбросить цвет контекста, когда текущий цвет контекста и цвет текущей точки отличаются! - person Vlad Fedoseev; 13.08.2012