使用UIBezierPath和CAShapeLayer时出现“无效上下文0x0”

时间:2014-08-02 21:13:22

标签: ios objective-c uibezierpath cashapelayer

我遇到的困境与this SO thread中描述的困境非常相似。我阅读了该主题的每个答案,但无法找到解决我问题的任何答案。我已将问题缩小到下面函数内的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。这是一个   严重错误。此应用程序或它使用的库正在使用   无效的上下文,从而导致整体退化   系统稳定性和可靠性。这个通知是礼貌的:拜托   解决这个问题。在即将到来的更新中,它将成为一个致命的错误。

1 个答案:

答案 0 :(得分:24)

您正在混合您的API。当您使用CAShapeLayer时,您实际上并不自己进行绘图,只需配置对象并让CoreAnimation渲染服务器执行绘图。使用CoreGraphics,您可以在进程中绘制CGContextRef。你的问题是需要创建CGContextRef(在[UIView drawRect:]中自动发生)。你可以使用UIGraphicsBeginImageContext中的一个来做...通常,但在这里你实际上并不想要CG,你想要CA.因此,只需省略这四行,并确保您的CAShapeLayer配置正确,您就会很好。