gpt4 book ai didi

ios - 清除 drawRect shape-layer 绘图中的绘图

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:21 25 4
gpt4 key购买 nike

为了节省在此处进行谷歌搜索的任何人的时间,我错误地认为 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() }
}
}
...
}

有没有更好的清除“图层”绘图的方法?

最佳答案

Here's a typical way to draw in drawRect

不,不是。这是完全不典型的——而且是完全错误的。

您在 drawRect 中唯一应该做的就是绘制到当前上下文中。例如:

let circlePath = UIBezierPath(ovalInRect:rect)
circlePath.stroke() // draws into the current context

但是您的 代码完全是另一回事:您正在创建一堆附加层。这正是它的问题所在,也是为什么您对事物的行为方式感到困惑的原因。如果您在 drawRect 中做了正确的事情,您会发现无论何时调用它, View 中的绘图都会被清除。在您的 View 中绘图未被清除,因为您的 View 中没有绘图。一切都在这些额外的层中。

那么,重新开始吧。学习正确使用 drawRect。要么直接绘制到当前上下文中,要么将图层管理代码放在其他地方;但不要通过在 drawRect 中进行图层管理来组合它们。

关于ios - 清除 drawRect shape-layer 绘图中的绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37231847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com