[ios]CoreGraphics 到 CGContextDrawPath 绘图结果︰ 0x0 的上下文无效

标签: sprite-kit ios Swift
发布时间: 2017/4/3 22:33:32
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我得到吨的 CGContextDrawPath: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable. 从这段代码的错误。它是在 SKScene 内执行。基本上我得到用户的图形在屏幕上作为 SKShapeNode。然后我填充该绘图的路径与圈子的核心图形。然而的代码运行速度慢,给了我的错误吨。我有点新的 Swift 。你能帮我什么上?我如何可以加快这?如何给予 CoreGraphics 适当的背景?

                    let boundingBox = createdShape.frame
                    for j in stride(from: Int(boundingBox.minX), to: Int(boundingBox.maxX), by: 10) {
                        for i in stride(from: Int(boundingBox.minY), to: Int(boundingBox.maxY), by: 10) {
                        //for i in 0..<10 {
                            counter += 1
                            //let originalPoint = CGPoint(x: ((boundingBox.maxX - boundingBox.minX)/2)+boundingBox.minX, y: (boundingBox.maxY-CGFloat(i*10)))
                            //let originalPoint = CGPoint(x: CGFloat(j), y: (boundingBox.maxY-CGFloat(i*10)))
                            let originalPoint = CGPoint(x: CGFloat(j), y: (CGFloat(i)))
                            let point:CGPoint = self.view!.convert(originalPoint, from: self)

                            if (createdShape.path?.contains(createdShape.convert(originalPoint, from: self)))! {
                                let circlePath = UIBezierPath(arcCenter: point, radius: CGFloat(5), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)
                                circlePath.fill()

                                let shapeLayer = CAShapeLayer()
                                shapeLayer.path = circlePath.cgPath

                                shapeLayer.fillColor = UIColor(red:  180/255, green: 180/255, blue: 180/255, alpha: 0.4).cgColor
                                shapeLayer.strokeColor = UIColor(red:  180/255, green: 180/255, blue: 180/255, alpha: 0.4).cgColor
                                shapeLayer.lineWidth = 0.0

                                view!.layer.addSublayer(shapeLayer)
                            }

                        }
                    }

解决方法 1:

看看你的代码,我相信的罪魁祸首一行代码是︰

circlePath.fill()

作为 UIBezierPath.fill() 是一种核心图形绘制操作,它需要在为了让它知道在哪里实际上将绘图核心图形上下文中调用。

这通常是内部 UIGraphicsBeginImageContextWithOptions() / UIGraphicsEndImageContext() 在哪里您显式创建和结束范围内,或在某些 UIKit 方法,如 UIView.drawRect() 的上下文自动为您管理。

从看来,调用 fill() ,活在当下的上下文之外都是您的代码的一部分,这就是为什么它会报告上下文无效的 0x0。

在这特定的情况下,它看起来像你正在使用的 circlePath 对象作为剪贴蒙版为 CAShapeLayer ,因此它可能不是需要调用 fill() 那里。

让我知道是否你需要进一步澄清。:)

赞助商