CGContext 的奇怪错误

Posted

技术标签:

【中文标题】CGContext 的奇怪错误【英文标题】:Strange Error with CGContext 【发布时间】:2014-06-12 21:09:02 【问题描述】:

我遇到错误

fatal error: Can't unwrap Optional.None
(lldb)

使用此代码

    var context:CGContextRef = UIGraphicsGetCurrentContext()
    let radius:CGFloat = 5
    CGContextSetRGBStrokeColor(context, 1, 1, 1, 1)
    var tempRect:CGRect = CGRectMake(5, 5, 20, 20)
    let minX = tempRect.minX, midX = tempRect.midX, maxX = tempRect.maxX
    let minY = tempRect.minY, midY = tempRect.midY, maxY = tempRect.maxY
    CGContextMoveToPoint(context, minX, minY)
    CGContextAddArcToPoint(context, minX, minY, midX, midY, radius)
    CGContextAddArcToPoint(context, maxX, minY, maxX, midY, radius)
    CGContextAddArcToPoint(context, maxX, maxY, midX, maxY, radius)
    CGContextAddArcToPoint(context, minX, maxY, minX, midY, radius)
    CGContextClosePath(context)
    CGContextDrawPath(context, kCGPathFillStroke)

我不明白问题出在哪里。我想做的是在 Swift 中创建一个带圆角的矩形。为什么我会收到此错误,有没有更简单的方法可以做到这一点?

【问题讨论】:

不应该是CGContext,不是CGContextRef吗?一切都失去了它的“参考”。 【参考方案1】:

问题是没有当前上下文。因此UIGraphicsGetCurrentContext() 想要返回 NULL (nil)。在继续之前,您应该在条件中测试context

您还应该将context 输入为CGContext!,因为这是UIGraphicsGetCurrentContext() 返回的内容——一个上下文或nil,包含在一个Optional 中,隐式展开。因此,当您获得上下文时,您将能够使用它而无需在任何地方使用问号。更好的是,根本不要给它显式类型; Swift 比你更清楚UIGraphicsGetCurrentContext() 返回的内容。

【讨论】:

是的,有一个更简单的方法;使用 UIBezierPath。 UIBezierPath 不是大部分贬值了吗?另外,如何将 tempRect 作为上下文传递? (1) 为什么您认为 UIBezierPath 已被弃用? (2) 您没有将 rect 作为上下文传递。你有一个上下文,或者你没有。如果你不这样做,你就不能画画。如果你这样做,它有一个大小。你可能会问如何制作一个上下文;使用 UIGraphicsBeginImageContextWithOptions (如果这个上下文最终应该成为一个图像,那就是)。或者将您的代码放在 Cocoa 已经为您提供上下文的地方。请参阅我对如何绘制的完整讨论:apeth.com/iosBook/ch15.html

以上是关于CGContext 的奇怪错误的主要内容,如果未能解决你的问题,请参考以下文章

Linux升级openssl时遇到的奇怪错误

呈现 UIAlertController 时出现 CGContext 错误

仅在模拟器中出现 CGContext 错误?

使用valgrind时出现奇怪的错误?也许是一个错误?

MySQL 语法错误?奇怪的错误

在spark中遇到了奇怪的错误,找到了奇怪的解决方法