调用 UIGraphicsBeginImageContext 时出现无效上下文 0x0 错误。调用任何 Core Graphics 'AddPath' 函数时也会出现类似错误

Invalid context 0x0 error when calling UIGraphicsBeginImageContext. Similar error occurs when calling any Core Graphics 'AddPath' functions as well

错误就发生在这一行:

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

它来自自定义 class,如下所示:

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 非常陌生。当 subclassing UIControl 时,在 drawRect 函数之外创建上下文是否有问题?

编辑:准确的错误是:

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

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

这个错误很常见。 有些人只是忽略它。 这意味着您在没有上下文的情况下调用 CG 函数。 CG是一个C API 不是面向对象的所以每次都需要提供一个Context。 如果你在 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。

希望对您有所帮助。

查看此 SO CGContextSaveGState invalid context,它帮助我在修改状态栏外观键失败后解决了这个问题。这可能意味着您的图像只有 (0,0) 的大小。