【问题标题】:Erase all contents from CAShapeLayer擦除 CAShapeLayer 中的所有内容
【发布时间】:2018-05-15 13:58:17
【问题描述】:

我有一个在 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)

}

【问题讨论】:

    标签: ios swift core-graphics calayer cashapelayer


    【解决方案1】:

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

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

    只需使用addSublayer 添加新的:

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

    【讨论】:

    • 或者一行删除:yourLayer.sublayers?.forEach { $0.removeFromSuperlayer() }
    【解决方案2】:

    您可以通过制作删除旧图层

    oldLayer.removeFromSuperlayer()
    

    然后添加一个新的

    parentLayer.addSublayer(newLayer)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-05
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多