错误就发生在这一行:
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。这是一个严重的错误。该应用程序或其使用的库正在使用无效上下文,从而导致系统稳定性和可靠性的整体下降。此通知是出于礼貌:请解决此问题。在即将到来的更新中它将成为 fatal error 。
CGContextSetStrokeColorWithColor:无效上下文 0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效上下文,从而导致系统稳定性和可靠性的整体下降。此通知是出于礼貌:请解决此问题。在即将到来的更新中它将成为 fatal error 。
最佳答案
此错误很常见。
有些人只是忽略它。
这意味着您在没有上下文的情况下调用 CG 函数。
CG是一个C API,不是面向对象的,所以你每次都需要提供一个Context。
如果您使用的是 drawRect:
方法,则不需要它。
因此,在 fillCircle 中,您必须提供有效的上下文。
问题是,当您执行 bulletColor.set()
时,没有上下文。
在您的情况下,最好的想法是强制调用 drawrect:
方法。
为此,您可以在 fillCircle 函数中调用此方法。
self.setNeedsDisplay();
为此,您必须在 drawRect 方法中处理所有绘图逻辑。
Apple 制作了核心显卡指南: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html 非常有趣。
注意:Quartz 2d 是 Core Graphics。
希望有帮助。
关于ios - 调用 UIGraphicsBeginImageContext 时出现无效上下文 0x0 错误。调用任何 Core Graphics 'AddPath' 函数时也会出现类似的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933118/