清除 drawRect shape-layer 绘图中的绘图
To clear drawing in drawRect shape-layer drawing
为了节省任何人在这里谷歌搜索的时间,我错误地认为 clearsContextBeforeDrawing
会 也会清除 drawRect 中添加的任何图层。它没有。
当然,正如 Matt 所解释的那样,您当然应该只在 drawRect 中以普通方式绘制,然后 clearsContextBeforeDrawing
才能正常工作。例如,
override func drawRect(rect: CGRect)
{
// clearsContextBeforeDrawing works perfectly here as normal
// don't add any layers in here :)
let dotPath = UIBezierPath(ovalInRect:rect)
mainColor.setFill()
dotPath.fill()
let ins:CGFloat = ( ringThickness / 2 )
let circlePath = UIBezierPath(ovalInRect: CGRectInset(rect,ins,ins) )
circlePath.lineWidth = ringThickness
ringColor.setStroke()
circlePath.stroke()
}
这是一个糟糕的绘制方式drawRect
override func drawRect(rect: CGRect)
{
let circlePath = UIBezierPath(ovalInRect:rect)
let circle = CAShapeLayer()
circle.path = circlePath.CGPath
circle.fillColor = someColor.CGColor
layer.addSublayer(circle)
... and a few more layers like ...
blah.fillColor = someColor.CGColor
layer.addSublayer(blah)
}
但是绘制前如何清零呢?
设置clearsContextBeforeDrawing
什么都不做。
我唯一能清除的方法是删除所有图层:
override func drawRect(rect: CGRect)
{
// first remove all layers...
if let sublayers = layer.sublayers {
for layer in sublayers {
if layer.isKindOfClass(CAShapeLayer) //(essential)
{ layer.removeFromSuperlayer() }
}
}
...
}
有没有更好的清除"layer"图的方法?
Here's a typical way to draw in drawRect
不,不是。这完全不典型——而且完全错误。
您在 drawRect
中唯一应该做的就是融入当前环境。例如:
let circlePath = UIBezierPath(ovalInRect:rect)
circlePath.stroke() // draws into the current context
但是 您的 代码完全是另一回事:您正在创建一堆 附加层 。这正是它的问题所在,也是为什么您对事物的行为方式感到困惑的原因。如果您在 drawRect
中做了正确的事情,您会发现确实无论何时调用它,视图 中的绘图都会被 清除。 您视图中的 绘图没有被清除,因为您的视图中没有 绘图。一切都在这些额外的层中。
所以,重新开始。学会正确使用 drawRect
。要么直接绘制到当前上下文中,要么将图层管理代码放在其他地方;但不要通过在 drawRect
.
中进行图层管理来组合它们
为了节省任何人在这里谷歌搜索的时间,我错误地认为 clearsContextBeforeDrawing
会 也会清除 drawRect 中添加的任何图层。它没有。
当然,正如 Matt 所解释的那样,您当然应该只在 drawRect 中以普通方式绘制,然后 clearsContextBeforeDrawing
才能正常工作。例如,
override func drawRect(rect: CGRect)
{
// clearsContextBeforeDrawing works perfectly here as normal
// don't add any layers in here :)
let dotPath = UIBezierPath(ovalInRect:rect)
mainColor.setFill()
dotPath.fill()
let ins:CGFloat = ( ringThickness / 2 )
let circlePath = UIBezierPath(ovalInRect: CGRectInset(rect,ins,ins) )
circlePath.lineWidth = ringThickness
ringColor.setStroke()
circlePath.stroke()
}
这是一个糟糕的绘制方式drawRect
override func drawRect(rect: CGRect)
{
let circlePath = UIBezierPath(ovalInRect:rect)
let circle = CAShapeLayer()
circle.path = circlePath.CGPath
circle.fillColor = someColor.CGColor
layer.addSublayer(circle)
... and a few more layers like ...
blah.fillColor = someColor.CGColor
layer.addSublayer(blah)
}
但是绘制前如何清零呢?
设置clearsContextBeforeDrawing
什么都不做。
我唯一能清除的方法是删除所有图层:
override func drawRect(rect: CGRect)
{
// first remove all layers...
if let sublayers = layer.sublayers {
for layer in sublayers {
if layer.isKindOfClass(CAShapeLayer) //(essential)
{ layer.removeFromSuperlayer() }
}
}
...
}
有没有更好的清除"layer"图的方法?
Here's a typical way to draw in drawRect
不,不是。这完全不典型——而且完全错误。
您在 drawRect
中唯一应该做的就是融入当前环境。例如:
let circlePath = UIBezierPath(ovalInRect:rect)
circlePath.stroke() // draws into the current context
但是 您的 代码完全是另一回事:您正在创建一堆 附加层 。这正是它的问题所在,也是为什么您对事物的行为方式感到困惑的原因。如果您在 drawRect
中做了正确的事情,您会发现确实无论何时调用它,视图 中的绘图都会被 清除。 您视图中的 绘图没有被清除,因为您的视图中没有 绘图。一切都在这些额外的层中。
所以,重新开始。学会正确使用 drawRect
。要么直接绘制到当前上下文中,要么将图层管理代码放在其他地方;但不要通过在 drawRect
.