繁体   English   中英

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

[英]When creating a custom View in Swift, how can you draw on top of the current context from outside the drawRect function?

我正在尝试创建可以填充的项目符号点:

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函数。 存储一个新变量,该变量指示项目符号点已填充的行数numberOfFilledBullets。

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()
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM