неверный контекст 0x0 при использовании UIBezierPath и CAShapeLayer

У меня затруднительное положение, очень похожее на описанное в эта ветка SO. Я прочитал каждый ответ в этой теме и не смог найти ни одного, который решил бы мою проблему. Я сузил свою проблему до 4 строк внутри функции ниже. Каждая из 4 строк выводит несколько строк ошибок, все из которых я перечислил ниже (я удалил дубликаты).

Я попытался переместить [path closePath]; ниже этих 4 строк, но это ничего не меняет. Я также установил точку останова перед первой строкой и вручную просмотрел функцию строка за строкой, и только эти 4 строки вызывают хаос.

Судя по этой проблеме, все отображается точно так, как должно, но консоль переполняется такими сообщениями.

Любая помощь будет высоко оценена, и я был бы рад предоставить любую дополнительную информацию и обновления.


Функция:

-(CAShapeLayer *)lineBetweenPoint:(CGPoint)start andPoint:(CGPoint)end {

    //Draw the first circle
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:start radius:kLineEndRadius startAngle:0 endAngle:DEGREES_TO_RADIANS(360) clockwise:TRUE];

    //Add the line
    [path moveToPoint:start];
    [path addLineToPoint:end];
    [path moveToPoint:end];

    //Draw the second circle
    [path addArcWithCenter:end radius:kLineEndRadius startAngle:0 endAngle:DEGREES_TO_RADIANS(360) clockwise:TRUE];

    //Close the path and set the coloring
    [path closePath];

    /*The following 4 lines cause problems*/
    [[UIColor blueColor] setStroke]; /*CAUSES PROBLEM*/
    [[UIColor blueColor] setFill]; /*CAUSES PROBLEM*/
    [path stroke]; /*CAUSES PROBLEM*/
    [path fill]; /*CAUSES PROBLEM*/

    //Create a shape layer
    CAShapeLayer *shapeLayer = [CAShapeLayer layer];
    shapeLayer.path = [path CGPath];
    shapeLayer.strokeColor = [kLineColor CGColor];
    shapeLayer.lineWidth = kLineWidth;
    shapeLayer.fillColor = [kLineColor CGColor];

    //Return the layer
    return shapeLayer;
}

Вывод журнала:

: CGContextSetStrokeColorWithColor: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextSetFillColorWithColor: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextSaveGState: неверный контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextSetLineWidth: неверный контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextSetLineJoin: неверный контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextSetLineCap: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextSetMiterLimit: неверный контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextSetFlatness: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextAddPath: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextDrawPath: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.

: CGContextRestoreGState: недопустимый контекст 0x0. Это серьезная ошибка. Это приложение или используемая им библиотека используют недопустимый контекст и тем самым способствуют общему снижению стабильности и надежности системы. Это уведомление любезно: пожалуйста, исправьте эту проблему. Это станет фатальной ошибкой в ​​следующем обновлении.


person rebello95    schedule 02.08.2014    source источник
comment
Вы устанавливаете цвет и обводите контур, когда они рисуются, обычно в drawRect, а не как часть пути. Должен быть текущий графический контекст.   -  person zaph    schedule 03.08.2014


Ответы (1)


Вы смешиваете свой API. Когда вы используете CAShapeLayer, вы на самом деле не рисуете сами, вы просто настраиваете объект и позволяете серверу рендеринга CoreAnimation делать рисунок. С CoreGraphics вы рисуете в процессе работы в CGContextRef. Ваша проблема здесь в том, что необходимо создать CGContextRef (что происходит автоматически в -[UIView drawRect:]). Вы бы сделали это, используя один из UIGraphicsBeginImageContext… обычно, но здесь вы на самом деле не хотите CG, вы хотите CA. Так что просто пропустите эти четыре строки и убедитесь, что ваш CAShapeLayer правильно настроен, и все будет хорошо.

person axiixc    schedule 02.08.2014
comment
Очень интересно, спасибо за объяснение. Удаление этих 4 строк сработало! - person rebello95; 03.08.2014
comment
Потрясающий! У меня были те же сообщения об ошибках, что и у исходного плаката, когда я пытался создать и нарисовать Безье из метода, который я вызывал в инициализаторе моего представления. Этот пост ясно дал понять, что допустимый контекст получается при вызове метода drawRect, поэтому мне просто нужно было вызвать свой метод рисования из drawRect, и теперь он работает как шарм. - person Felipe Ferri; 30.09.2014