要清除绘图drawRect形状图层
问题描述:
为了节省任何人在这里使用Google搜索的时间,我错误地认为clearsContextBeforeDrawing
将也清除添加在drawRect中的任何图层。它不是。要清除绘图drawRect形状图层
当然,正如马特所解释的那样,您当然只能在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() }
}
}
...
}
有没有更好的方式来清除“层”在画什么?
答
下面是一个典型方式的drawRect
画不,事实并非如此。这完全是非典型的 - 而且完全错误。
你应该在drawRect
中做的唯一事情就是绘制到当前的上下文中。例如:
let circlePath = UIBezierPath(ovalInRect:rect)
circlePath.stroke() // draws into the current context
但您代码是别的东西完全:你创建了一堆附加层。这正是它的错误所在,以及为什么你会左右事情似乎表现的方式。如果您在drawRect
中做了正确的事情,您会发现确实每当它被调用时,视图中的图形都被清除了。 您的绘图在您的视图中未被清除,因为您有没有绘图在您的视图中。一切都在这些额外的层面。
所以,重新开始。学会正确使用drawRect
。要么直接绘制到当前的上下文中,要么将您的图层管理代码放在其他地方;但是不要通过在drawRect
中进行图层管理来将它们组合在一起。
这是一个太开放的问题。我不知道你的总体目标是什么。 – matt
无论如何,我完全明白 - 真棒。当然,我应该吸取当前的情况。然后'clearsContextBeforeDrawing'确实可行 - 好吧!所以我的困惑是,我认为'clearsContextBeforeDrawing'也会“清除图层”,如果你明白我的意思。你已经让我平静了:)尼斯... – Fattie