ios - 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 环境变量。
解决方案
一切都很好,直到你说:
bezierPath.stroke()
在那之前,你只是在制定一条路径,这是一组中性的指令。但是当你说 时stroke()
,你是在说:“好吧,现在画吧,宝贝!” 运行时现在正在回复:“呃,在哪里?你只能在某种绘图(图形)上下文中绘制,例如 UIView 的图形上下文、CALayer 的图形上下文或 UIImage 上下文。你不在任何那些。你试图在不知名的地方画画。我不能那样做,即使我能做到,你也什么也看不到。
那么,什么是玩绘图命令的好方法呢?如果您想响应按钮单击进行绘制,这是最好的方法:
制作适当大小的 UIGraphicsImageRenderer。
调用渲染器的
image
方法。该
image
方法需要一个闭包。那就是你画画的地方!你现在有一个 UIImage (从方法调用返回
image
)。制作一个 UIImageView 并将其
image
设置为该图像。将 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)
}
推荐阅读
- python - .get_text() 在 BeautifulSoup 中不起作用
- hyperledger-fabric - Hyperledger Fabric 网络配置问题
- javascript - 拒绝执行内联脚本,因为它违反了以下内容-基于 react 的 chrome 应用程序的内容安全策略指令
- typescript - 如何用一种类型定义正常功能
- flutter - 如何在颤振多模块项目中注入依赖项
- regex - 如何确保分隔符之间的完整字符串符合正则表达式模式?
- c - 用C计算程序的执行时间
- c++ - 简单 c++ for 循环的预期最大指令吞吐量
- google-chrome - Puppeteer 回答屏幕共享弹出窗口
- java - 如何解析泛型类型的Java注释?