【问题标题】:Invalid context 0x0 error when calling UIGraphicsBeginImageContext. Similar error occurs when calling any Core Graphics 'AddPath' functions as well调用 UIGraphicsBeginImageContext 时出现无效的上下文 0x0 错误。调用任何 Core Graphics 'AddPath' 函数时也会发生类似错误
【发布时间】:2015-01-13 23:03:29
【问题描述】:

错误就发生在这一行:

UIGraphicsBeginImageContext(CGSize(width: 6, height: 6))

它来自一个自定义类,如下所示:

import UIKit

class bulletGroup: UIControl {

  var radius: CGFloat = 3
  var bulletSpacing: CGFloat = 10
  var numberOfBullets = 5
  var bulletColor = UIColor.blackColor()

  override func drawRect(rect: CGRect) {

    let ctx = UIGraphicsGetCurrentContext()

    CGContextSetLineCap(ctx, kCGLineCapButt)

    bulletColor.set()

    for i in 1...numberOfBullets{
      CGContextAddArc(ctx, CGFloat(Float(i) * Float(bulletSpacing)), self.frame.size.height/2, radius, 0, CGFloat(2 * M_PI), 0)
      CGContextDrawPath(ctx, kCGPathStroke)
    }
  }

  func fillCircle(circleNUmber: Int){
    bulletColor.set()

    UIGraphicsBeginImageContext(CGSize(width: 6, height: 6))
  }
}

我对 Core Graphic 非常陌生。子类化 UIControl 时在 drawRect 函数之外创建上下文有什么问题吗?

编辑:确切的错误是:

CGContextSetFillColorWithColor:无效的上下文 0x0。这是一个严重的错误。此应用程序或它使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体下降。此通知是出于礼貌:请解决此问题。这将在即将到来的更新中成为致命错误。

CGContextSetStrokeColorWithColor:无效的上下文 0x0。这是一个严重的错误。此应用程序或它使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体下降。此通知是出于礼貌:请解决此问题。这将成为即将到来的更新中的致命错误。

【问题讨论】:

  • 我之前就有过这个。不知道如何解决,所以我最终重构了我的所有代码:/ 如果有解决方案,我全神贯注
  • 正如 LastMove 所说,如果你想重绘改变了某些属性的视图,你应该调用setNeedsDisplay。顺便说一句,如果您打算使用UIGraphicsBeginImageContext(例如,您打算使用CoreGraphics 创建一个稍后将使用的图像),则必须通过调用UIGraphicsEndImageContext 来平衡它.

标签: ios xcode swift core-graphics


【解决方案1】:

这个错误很常见。 有些人只是忽略它。 这意味着您正在调用没有上下文的 CG 函数。 CG 是一个 C API 不是面向对象的所以你每次都需要提供一个上下文。 如果您使用drawRect: 方法,则不需要。 因此,在您的 fillCircle 中,您必须提供有效的上下文。 问题是当你做bulletColor.set() 时没有上下文。

在您的情况下,最好的办法是强制调用 drawrect: 方法。 为此,您可以在 fillCircle 函数中调用此方法。

self.setNeedsDisplay();

为此,您必须在 drawRect 方法中处理所有绘图逻辑。

Apple 制作了 Core Graphics 指南: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html 很有意思。

注意:Quartz 2d 是 Core Graphics。

希望对你有帮助。

【讨论】:

  • 非常感谢您的回复,不过我还有另一个问题。我正在尝试创建一个自定义控件,这是否意味着我不能有一个名为fillCircle 的单独函数?如果一切都在 drawRect 中完成,我该如何填写特定的圆圈?
  • 如果圆圈是您的“bulletGroup”绘图的一部分。您可以在该类中创建一个变量并将其设置在 fillCircle 方法中。您想在 fillCircle 中填写什么?
  • 我只是想用黑色填充子弹。我最初想在一个单独的函数中执行此操作,但我了解到我只能在 drawRect 中成功使用UIGraphicsGetCurrentContext()。我会以错误的方式解决这个问题吗?有没有更简单的填圈方法?
  • 那么你会从drawRect方法中调用fillCircle吗?
  • 如果是,它看起来没问题,但删除 UIGraphicsBeginImageContext(CGSize(width: 6, height: 6))
【解决方案2】:

看到这个 SO CGContextSaveGState invalid context 在未成功摆弄状态栏外观键后帮助我解决了这个问题。这可能意味着您的图像只有 (0,0) 的大小。

【讨论】:

  • 这正是我收到此错误的原因。好电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2013-11-30
  • 2020-09-11
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多