【问题标题】:"invalid context 0x0" when using UIBezierPath and CAShapeLayer使用 UIBezierPath 和 CAShapeLayer 时出现“无效上下文 0x0”
【发布时间】:2014-09-25 19:01:40
【问题描述】:

我遇到的困境与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。这是一个 严重错误。此应用程序或它使用的库正在使用 无效的上下文,从而导致整体退化 系统的稳定性和可靠性。此通知是一种礼貌:请 解决这个问题。这将成为即将到来的更新中的致命错误。

【问题讨论】:

  • 你在绘制路径时设置颜色和描边,通常在drawRect,而不是路径的一部分。必须有当前的图形上下文。

标签: ios objective-c uibezierpath cashapelayer


【解决方案1】:

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

【讨论】:

  • 很有趣,谢谢你的解释。删除这 4 行有效!
  • 太棒了!当我尝试从我会在 View 的初始化程序上调用的方法创建和绘制 Bezier 时,我收到了与原始海报相同的错误消息。这篇文章清楚地表明,当调用 drawRect 方法时会获得一个有效的上下文,所以我只需要从 drawRect 调用我的绘图方法,现在它就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多