首页 > 解决方案 > BezierPath 未在按钮点击时显示 - CGContextSetStrokeColorWithColor:无效上下文 0x0

问题描述

如何在按钮点击上绘制 BezierPath?

我正在练习BezierPaths。我想要做的是BezierPaths在点击按钮时绘制一个形状,但是当我点击按钮时我在屏幕上看不到任何东西。我没有收到任何错误,只是下面显示的调试区域中的输出。

我错过了什么?

这是我的代码:

@IBAction func drawIt(_ sender: Any) {
    let bezierPath = UIBezierPath()
    bezierPath.move(to: CGPoint(x: 46.5, y: 50.14))
    bezierPath.addCurve(to: CGPoint(x: 77.5, y: 50.5), controlPoint1: CGPoint(x: 46.5, y: 50.14), controlPoint2: CGPoint(x: 64.74, y: 34.09))
    bezierPath.addCurve(to: CGPoint(x: 94.5, y: 96.5), controlPoint1: CGPoint(x: 84.5, y: 59.5), controlPoint2: CGPoint(x: 88.29, y: 74.25))
    UIColor.black.setStroke()
    bezierPath.lineWidth = 1
    bezierPath.stroke()
}

调试区:

CGContextSetStrokeColorWithColor:无效的上下文 0x0。如果要查看回溯,请设置 CG_CONTEXT_SHOW_BACKTRACE 环境变量。

标签: iosswift

解决方案


一切都很好,直到你说:

bezierPath.stroke()

在那之前,你只是在制定一条路径,这是一组中性的指令。但是当你说 时stroke(),你是在说:“好吧,现在吧,宝贝!” 运行时现在正在回复:“呃,在哪里?你只能在某种绘图(图形)上下文中绘制,例如 UIView 的图形上下文、CALayer 的图形上下文或 UIImage 上下文。你不在任何那些。你试图在不知名的地方画画。我不能那样做,即使我能做到,你也什么也看不到

那么,什么是玩绘图命令的好方法呢?如果您想响应按钮单击进行绘制,这是最好的方法:

  1. 制作适当大小的 UIGraphicsImageRenderer。

  2. 调用渲染器的image方法。

  3. image方法需要一个闭包。那就是你画画的地方!

  4. 你现在有一个 UIImage (从方法调用返回image)。

  5. 制作一个 UIImageView 并将其image设置为该图像。

  6. 将 UIImageView 粘贴到您的界面中。

例子:

@IBAction func drawIt(_ sender: Any) {
    let r = UIGraphicsImageRenderer(size: CGSize(width: 150, height: 150))
    let im = r.image { _ in
        let bezierPath = UIBezierPath()
        bezierPath.move(to: CGPoint(x: 46.5, y: 50.14))
        bezierPath.addCurve(to: CGPoint(x: 77.5, y: 50.5), controlPoint1: CGPoint(x: 46.5, y: 50.14), controlPoint2: CGPoint(x: 64.74, y: 34.09))
        bezierPath.addCurve(to: CGPoint(x: 94.5, y: 96.5), controlPoint1: CGPoint(x: 84.5, y: 59.5), controlPoint2: CGPoint(x: 88.29, y: 74.25))
        UIColor.black.setStroke()
        bezierPath.lineWidth = 1
        bezierPath.stroke()
    }
    let iv = UIImageView(image:im)
    iv.frame.origin = CGPoint(x: 100, y: 100)
    iv.layer.borderWidth = 1
    self.view.addSubview(iv)
}

推荐阅读