swift - 绘制曲线时出错
swift - error when drawing curve
我正在尝试编写一个绘制曲线的程序。曲线越短,它越接近绿色。这是绘制圆的代码:
func drawCircle(percent: CGFloat) {
// Set up all the data for the circle
let redAmt = 1 / 100 * percent
let greenAmt = 1 - redAmt
let circleColor = UIColor.init(red: redAmt, green: greenAmt, blue: 0, alpha: 1)
let lineWidth = CGFloat(12)
let centerX = self.frame.size.width / 2
let centerY = self.frame.size.height / 2
let radius = (self.frame.size.width - lineWidth) / 2
// Clear the area where the circle is going to be drawn
let clearCirclePath = UIBezierPath(arcCenter: CGPoint(x: centerX, y: centerY), radius: radius, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2), clockwise: true)
clearColor.setStroke()
clearCirclePath.lineWidth = lineWidth
clearCirclePath.stroke()
// Draw the circle
let circlePath = UIBezierPath(arcCenter: CGPoint(x: centerX, y: centerY), radius: radius, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2) * percent / 100, clockwise: true)
circleColor.setStroke()
circlePath.lineWidth = lineWidth
circlePath.stroke()
}
它在被 drawRect(rect: CGRect)
调用时工作正常,但当我尝试调用另一个文件时,它不起作用。它在视图控制器内的视图中绘制圆弧。它给我的错误是:ExerciseTracker[7270] <Error>: CGContextSetStrokeColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
非常感谢!
(我正在使用 Xcode 7.3.1)
您必须在有效的上下文中进行绘制。 drawRect:
提供了这样一个有效的上下文。简单地将代码放在 drawRect:
之外是行不通的,除非您明确创建自己的上下文,例如用于通过绘图创建图像的位图上下文。
您的 drawCircle
方法中的代码需要位于自定义视图 class 的 drawRect:
方法中。不要将 percent
作为参数传递,而是将其设置为实例变量。然后,只要您更新 percent
的值,您就可以调用 setNeedsDisplay()
来触发视图重绘自身。
我正在尝试编写一个绘制曲线的程序。曲线越短,它越接近绿色。这是绘制圆的代码:
func drawCircle(percent: CGFloat) {
// Set up all the data for the circle
let redAmt = 1 / 100 * percent
let greenAmt = 1 - redAmt
let circleColor = UIColor.init(red: redAmt, green: greenAmt, blue: 0, alpha: 1)
let lineWidth = CGFloat(12)
let centerX = self.frame.size.width / 2
let centerY = self.frame.size.height / 2
let radius = (self.frame.size.width - lineWidth) / 2
// Clear the area where the circle is going to be drawn
let clearCirclePath = UIBezierPath(arcCenter: CGPoint(x: centerX, y: centerY), radius: radius, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2), clockwise: true)
clearColor.setStroke()
clearCirclePath.lineWidth = lineWidth
clearCirclePath.stroke()
// Draw the circle
let circlePath = UIBezierPath(arcCenter: CGPoint(x: centerX, y: centerY), radius: radius, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2) * percent / 100, clockwise: true)
circleColor.setStroke()
circlePath.lineWidth = lineWidth
circlePath.stroke()
}
它在被 drawRect(rect: CGRect)
调用时工作正常,但当我尝试调用另一个文件时,它不起作用。它在视图控制器内的视图中绘制圆弧。它给我的错误是:ExerciseTracker[7270] <Error>: CGContextSetStrokeColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
非常感谢!
(我正在使用 Xcode 7.3.1)
您必须在有效的上下文中进行绘制。 drawRect:
提供了这样一个有效的上下文。简单地将代码放在 drawRect:
之外是行不通的,除非您明确创建自己的上下文,例如用于通过绘图创建图像的位图上下文。
您的 drawCircle
方法中的代码需要位于自定义视图 class 的 drawRect:
方法中。不要将 percent
作为参数传递,而是将其设置为实例变量。然后,只要您更新 percent
的值,您就可以调用 setNeedsDisplay()
来触发视图重绘自身。