自定义的UIView内无效的上下文为0x0(invalid context 0x0 within c

2019-10-29 16:33发布

我有一个自定义视图下面的代码。

@IBDesignable class SplitCircleView: UIView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        draw(frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        draw(frame)
    }

    override func draw(_ rect: CGRect) {

        self.backgroundColor = .clear

        drawSlice(rect: self.frame, startPercent: 87.5, endPercent: 37.5, color: .green)
        drawSlice(rect: self.frame, startPercent: 37.5, endPercent: 87.5, color: .red)
    }

    func drawSlice(rect: CGRect, startPercent: CGFloat, endPercent: CGFloat, color: UIColor) {

        let center = CGPoint(x: rect.origin.x + rect.width / 2, y: rect.origin.y + rect.height / 2)
        let radius = (min(rect.width, rect.height) / 2)
        let startAngle = startPercent / 100 * .pi * 2 - .pi
        let endAngle = endPercent / 100 * .pi * 2 - .pi
        let path = UIBezierPath()

        path.move(to: center)
        path.addArc(withCenter: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
        path.close()
        color.setFill()

        path.fill()
    }
}

我想画一个圆的两个半圆不同的颜色。

当我在操场实时取景观看这个看起来不错。 有一次,我把它放在一个应用程序它使我的问题。 当代码试图执行color.setFill()和path.fill()我得到的日志中的以下错误。

2018年6月1日14:37:08.118005 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextSetFillColorWithColor:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118055 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextSaveGState:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118094 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextSetFlatness:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118141 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextAddPath:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118184 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextDrawPath:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118222 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextRestoreGState:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118336 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextSetFillColorWithColor:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118376 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextSaveGState:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118413 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextSetFlatness:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118451 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextAddPath:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118491 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextDrawPath:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。 2018年6月1日14:37:08.118528 + 0100 SplitCircleView [21353:2290599] [未知过程名] CGContextRestoreGState:无效的上下文为0x0。 如果你想看到的回溯,请将CG_CONTEXT_SHOW_BACKTRACE环境变量。

我在做什么错了,我怎么能解决这个问题?

Answer 1:

在对文档draw(_ rect: CGRect)功能。 (最后的“讨论”的段落。)

你永远不应该直接调用此方法自己。

如果要触发这个功能,你应该使用...

self.setNeedsDisplay()

文档中的draw功能。

然而

作为@vacawama指出,(我错过了)绘制函数无论如何都将增加你的视图视图层次后调用。 所以,你不应该需要在所有这里来调用它。 它会为你自动发生。

所以里面init方法,就完全消除通话。

再打电话了,这地方如果视图改变形状,例如,或者如果你想改变它的内容。 即颜色,或什么的。



文章来源: invalid context 0x0 within custom UIView