我有以下自定义视图的代码。

@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-06-01 14:37:08.118005+0100 SplitCircleView[21353:2290599][未知进程名]CGContextSetFillColorWithColor:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118055+0100 SplitCircleView[21353:2290599][未知进程名]CGContextSaveGState:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118094+0100 SplitCircleView[21353:2290599][未知进程名]CGContextSetFlatness:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118141+0100 SplitCircleView[21353:2290599][未知进程名]CGContextAddPath:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118184+0100 SplitCircleView[21353:2290599][未知进程名]CGContextDrawPath:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118222+0100 SplitCircleView[21353:2290599][未知进程名]CGContextRestoreGState:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118336+0100 SplitCircleView[21353:2290599][未知进程名]CGContextSetFillColorWithColor:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118376+0100 SplitCircleView[21353:2290599][未知进程名]CGContextSaveGState:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118413+0100 SplitCircleView[21353:2290599][未知进程名]CGContextSetFlatness:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118451+0100 SplitCircleView[21353:2290599][未知进程名]CGContextAddPath:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118491+0100 SplitCircleView[21353:2290599][未知进程名]CGContextDrawPath:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
2018-06-01 14:37:08.118528+0100 SplitCircleView[21353:2290599][未知进程名]CGContextRestoreGState:无效上下文0x0。如果要查看回溯,请设置CG_CONTEXT_SHOW_backtrace环境变量。
我做错了什么?我该怎么解决?

最佳答案

draw(_ rect: CGRect)函数的文档中。(讨论的最后一段)
你不应该自己直接调用这个方法。
如果你想触发这个函数,你应该使用。。。

self.setNeedsDisplay()

Documentation for the draw function.
然而
正如@vacawama指出的(我错过了),在将视图添加到视图层次结构之后,仍然会调用draw函数。所以你根本不需要在这里叫它。它会自动为你发生。
所以在init方法中,只需完全删除调用。
再次调用它的地方是视图更改形状(例如)还是要更改其内容。比如颜色之类的。

关于swift - 自定义UIView中的无效上下文0x0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50644739/

10-10 18:11