Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 自定义UIView中的上下文0x0无效_Swift_Uiview_Drawrect_Cgcontext_Ibdesignable - Fatal编程技术网

Swift 自定义UIView中的上下文0x0无效

Swift 自定义UIView中的上下文0x0无效,swift,uiview,drawrect,cgcontext,ibdesignable,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(

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

@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(\urect:CGRect)
函数的文档中。(讨论的最后一段)

您不应该自己直接调用此方法

如果要触发此函数,应使用

self.setNeedsDisplay()

但是

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

因此,在
init
方法中,只需完全删除调用


再次调用它的地方是,如果视图更改了形状,例如,或者您想要更改它的内容。i、 e.颜色等。

绘图(rect:CGRect)
函数的文档中。(讨论的最后一段)

您不应该自己直接调用此方法

如果要触发此函数,应使用

self.setNeedsDisplay()

但是

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

因此,在
init
方法中,只需完全删除调用


再次调用它的地方是,如果视图更改了形状,例如,或者您想要更改它的内容。i、 所以我把draw(frame)改为self.setNeedsToDisplay(),问题马上就解决了!非常感谢。UI似乎是我需要提高知识的一个领域。我会尽快接受答案,因为它告诉我必须等待至少10分钟。您的
init
函数是否真的需要
setNeedDisplay
?视图第一次出现在视图层次结构中时将进行绘制。您是正确的。即使没有设置需要显示,它也可以工作。我还将drawSlice(rect:self.frame…)更改为drawSlice(rect:rect….感谢您的帮助,非常感谢。现在尝试解决冲突的约束问题,希望无需再次询问….@StartPlayer无需担心。如果您确实需要帮助,请提出一个新问题,我会看一看。同时,这是一个很好的起点…:为什么我以前从未见过该网站?!这非常有用。所以我将draw(frame)改为self.setNeedsToDisplay()问题马上就解决了!谢谢。UI似乎是我需要提高知识的一个领域。我会尽快接受答案,因为它告诉我必须等待至少10分钟。你真的需要
setNeedDisplay
init
函数中吗?视图将在第一次出现在视图层次结构中时绘制。你说得对。即使没有设置,也需要显示。我还更改了绘图