在 Swift 中创建自定义视图时,如何从 drawRect 函数外部绘制当前上下文



我正在尝试创建可以用以下内容填充的项目符号:

fillCircle

函数,但我发现成功执行此操作的唯一方法是从 drawRect 函数传递上下文。

我的类设置为首先使用 drawRect 函数绘制空项目符号,如下所示:

  override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    CGContextSetLineCap(context, kCGLineCapButt)
    bulletColor.set()
    for i in 1...numberOfBullets{
      CGContextAddArc(context, CGFloat(Float(i) * Float(bulletSpacing)), self.frame.size.height/2, radius, 0, CGFloat(2 * M_PI), 0)
      CGContextDrawPath(context, kCGPathStroke)
    }
  }

我正在尝试实现一个fillCircle函数,如下所示:

 func fillCircle(context: CGContextRef, circleNumber: Int){
    CGContextFillEllipseInRect(context, CGRect(x: CGFloat(circleNumber) * (bulletSpacing) - radius, y: self.frame.size.height/2 - radius, width: 2*radius, height: 2*radius))
    CGContextDrawPath(context, kCGPathStroke)
  }

这样该类的任何用户都可以随意填写项目符号,但我似乎无法从 drawrect 外部获取上下文。我无法从 drawRect 传入上下文,因为每次创建类时都会调用它。

如何在不更改 drawRect 的情况下实现 fillCircle 方法?

为什么在

添加新项目符号点时不能重绘它?您可以使用setNeedsDisplay函数。 存储一个新变量,指示带有填充项目符号点的行数,即填充项目符号数。

setNeedsDisplay重绘视图并再次调用drawRect

override func drawRect(rect: CGRect) {
    let context = UIGraphicsGetCurrentContext()
    CGContextSetLineCap(context, kCGLineCapButt)
    bulletColor.set()
    for i in 1...numberOfBullets{
      CGContextAddArc(context, CGFloat(Float(i) * Float(bulletSpacing)), self.frame.size.height/2, radius, 0, CGFloat(2 * M_PI), 0)
      CGContextDrawPath(context, kCGPathStroke)
    }
    for i in 1...numberOfFilledBullets {
       // fillCircle
        CGContextFillEllipseInRect(context, CGRect(x: CGFloat(i) * (bulletSpacing) - radius, y: self.frame.size.height/2 - radius, width: 2*radius, height: 2*radius))
        CGContextDrawPath(context, kCGPathStroke)
    }
}
func addNewLine {
    numberOfFilledBullets ++
    self.setNeedsDisplay()
}
func deleteLine {
    numberOfFilledBullets --
    self.setNeedsDisplay()
}

最新更新