删除CAShapeLayer中的所有内容

时间:2018-05-15 13:58:18

标签: ios swift core-graphics calayer cashapelayer

我有一个在AVCaptureVideoPreviewLayer顶部绘制矩形的函数。需要在触发器上刷新此矩形,并绘制新的矩形。是否最好从CAShapeLayer中删除所有内容,或者只删除图层并添加新图层?我不知道怎么办,但我的尝试在下面。

func showRectangle(recLayer: CAShapeLayer, vnRectangleObservation: VNRectangleObservation) -> Void{

    // new CAShapeLayer
    let newLayer = CAShapeLayer.init()

    let rectangle = UIBezierPath.init()
    rectangle.move(to: CGPoint.init(x: vnRectangleObservation.topLeft.x, y: vnRectangleObservation.topLeft.y))
    rectangle.addLine(to: CGPoint.init(x: vnRectangleObservation.topRight.x, y: vnRectangleObservation.topRight.y))
    rectangle.addLine(to: CGPoint.init(x: vnRectangleObservation.bottomRight.x, y: vnRectangleObservation.bottomRight.y))
    rectangle.addLine(to: CGPoint.init(x: vnRectangleObservation.bottomLeft.x, y: vnRectangleObservation.bottomLeft.y))

    rectangle.close()

    newLayer.opacity = 0.4
    newLayer.path = rectangle.cgPath
    newLayer.fillColor = UIColor.orange.cgColor

    // replace current layer containing old rectangle
    recLayer.replaceSublayer(recLayer, with: newLayer)

}

2 个答案:

答案 0 :(得分:1)

您可以通过

删除旧图层
oldLayer.removeFromSuperlayer()

然后添加一个新的

parentLayer.addSublayer(newLayer)

我认为最好的解决方案是在视图出现在屏幕上之前准备好两个图层并通过触发器更改它们。

答案 1 :(得分:1)

您可以遍历所有子图层并将其删除。

for sublayer in yourLayer.sublayers ?? [] {
    sublayer.removeFromSuperlayer()
}

只需使用addSublayer添加新内容:

let newSublayer = CAShapeLayer()
yourLayer.addSublayer(newSublayer)