调用 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) 的大小。
错误就发生在这一行:
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) 的大小。