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

标签 ios xcode swift core-graphics

错误就发生在这一行:

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/

相关文章:

objective-c - 运行错误将我发送到我没有写的代码

ios - Xcode:选择 Storyboard之外的对象

ios - Xcode "Size to fit contents"禁用

swift - 如何实现 Enum 对案例进行论证

ios - 为 iOS 9.0 编译,但模块 'BSGridCollectionViewLayout' 的最低部署目标为 iOS 10.0

ios - 无法在 Swift 中将变量传递给 prepareForSegue?

ios - 导航栏背景图-支持iOS6和iOS7

ios - 登录时禁用(登录)按钮

ios - 使用 MongoDB 和 Eve 快速开发 iOS 原型(prototype)?

ios - 如何在 Swift 2 中使用可选绑定(bind)