为了节省在Google上搜索的人的时间,我错误地认为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() }
}
}
...
}
有没有更好的方法来清除“图层”图纸?
答案 0 :(得分:4)
这是在drawRect中绘制的典型方法
不,不是。这完全是非典型的 - 完全错误。
你应该在drawRect
中做的唯一事情是进入当前的背景。例如:
let circlePath = UIBezierPath(ovalInRect:rect)
circlePath.stroke() // draws into the current context
但你的代码完全与其他东西有关:你正在创建一堆附加图层。而这正是它的错误,以及为什么你会对事物的行为方式感到头疼。如果你在drawRect
中做了正确的事情,你会发现无论何时调用它,视图中的绘图都被清除。由于您的视图中没有否绘图,因此未在视图中清除您的绘图。一切都在这些额外的层次中。
所以,重新开始。学习正确使用drawRect
。直接绘制到当前上下文中,或将您的图层管理代码放在其他位置;但不要通过在drawRect
中进行图层管理来组合它们。