清除drawRect形状层绘图中的绘图
Posted
技术标签:
【中文标题】清除drawRect形状层绘图中的绘图【英文标题】:To clear drawing in drawRect shape-layer drawing 【发布时间】:2016-05-14 21:02:37 【问题描述】:为了节省任何在这里搜索的人的时间,我错误地认为clearsContextBeforeDrawing
会同时清除在 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()
...
有没有更好的清除“图层”绘图的方法?
【问题讨论】:
【参考方案1】:这是在drawRect中绘制的典型方法
不,不是。这完全不典型——而且完全错误。
您在drawRect
中唯一应该做的就是绘制到当前上下文中。例如:
let circlePath = UIBezierPath(ovalInRect:rect)
circlePath.stroke() // draws into the current context
但是你的代码完全是另外一回事:你正在创建一堆附加层。这正是它的问题所在,以及为什么你对事物的行为方式感到摸不着头脑。如果您在drawRect
中做的事情是正确的,您会发现实际上无论何时调用它,视图中的绘图 都会被清除。 您的视图中的 绘图没有被清除,因为您的视图中没有 绘图。一切都在这些额外的层中。
所以,重新开始。学会正确使用drawRect
。要么直接绘制到当前上下文中,要么将你的层管理代码放在其他地方;但不要通过在drawRect
中进行层管理来组合它们。
【讨论】:
这是一个太开放的问题。我不知道你的总体目标是什么。 无论如何我完全明白 - 太棒了。当然,我应该一直在吸引当前的上下文。然后确实clearsContextBeforeDrawing
确实有效 - 耶!所以我的困惑是,如果你明白我的意思,我认为clearsContextBeforeDrawing
也会“清除层”。你让我直截了当:) 很好......以上是关于清除drawRect形状层绘图中的绘图的主要内容,如果未能解决你的问题,请参考以下文章