Стереть все содержимое из CAShapeLayer - PullRequest
0 голосов
/ 15 мая 2018

У меня есть функция, которая рисует прямоугольники поверх 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 голосов
/ 15 мая 2018

Вы можете перебрать все подслои и удалить их.

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

И просто добавьте новые с помощью addSublayer:

let newSublayer = CAShapeLayer()
yourLayer.addSublayer(newSublayer)
0 голосов
/ 15 мая 2018

Вы можете удалить свой старый слой, сделав

oldLayer.removeFromSuperlayer()

А затем добавить новый

parentLayer.addSublayer(newLayer)

Я думаю, что лучшее решение - подготовить оба слоя до того, как ваш вид появится на экране, и изменить их по триггеру.

...