在 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 函数传递上下文。
我的 class 设置为首先使用 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)
}
这样 class 的任何用户都可以随意填写项目符号,但我似乎无法从 drawrect 外部获取上下文。我无法从 drawRect 传入上下文,因为每次创建 class 时都会调用它。
如何在不改变 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()
}
我正在尝试创建可以用以下内容填写的要点:
fillCircle
函数,但我发现成功执行此操作的唯一方法是从 drawRect 函数传递上下文。
我的 class 设置为首先使用 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)
}
这样 class 的任何用户都可以随意填写项目符号,但我似乎无法从 drawrect 外部获取上下文。我无法从 drawRect 传入上下文,因为每次创建 class 时都会调用它。
如何在不改变 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()
}