自定义UIView

时间:2018-06-01 13:39:32

标签: swift uiview drawrect cgcontext ibdesignable

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

@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环境变量。

我做错了什么,如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

draw(_ rect: CGRect)功能的文档中。 ("讨论"的最后一段。)

  

你不应该直接自己调用这个方法。

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

self.setNeedsDisplay()

Documentation for the draw function.

<强>然而

正如@vacawama指出的那样(我错过了),无论如何都会在将视图添加到视图层次结构后调用绘图函数。所以你根本不需要在这里打电话。这将自动发生。

所以在init方法中,只需完全删除该调用。

再次调用它的地方是,例如视图是否改变形状,或者是否要更改其内容。即颜色或其他东西。