使用CAShapeLayer和removeFromSuperLayer

时间:2018-01-30 07:28:55

标签: ios swift cashapelayer

我正在创建一个应用程序,它应该从触摸点绘制对象。

我正在使用CAShapeLayerUIBezierPath,但是当我使用removeFromSuperlayer()时,没有任何反应。

我需要删除旧形状并只绘制新形状。

我不知道为什么,但经过一次构建并将此应用程序上传到我的iPad后,Xcode给了我一个错误:

  

无法对CAShapeLayer

类型的非可选值使用可选链接

任何可以帮助我的人?​​

另一个问题是:

如何只绘制一条线?

当我得到2分时,它什么都没画,应用程序在3分以上之后只绘制对象。

以下是我的代码的一部分:

private func drawObj(){

    let objectPath = UIBezierPath()

    objectPath.move(to: CGPoint(x: pointsX[0], y: pointsY[0]))

    let xx = pointsX.count - 1
    print(xx)

    for i in 1...xx {
        objectPath.addLine(to: CGPoint(x: pointsX[i], y: pointsY[i]))
    }

    objectPath.close()

    let object = CAShapeLayer()
    object.removeFromSuperlayer()
    object.path = objectPath.cgPath
    object.fillColor = UIColor.red.cgColor
    object.opacity = 0.2
    self.view.layer.addSublayer(object)
}

2 个答案:

答案 0 :(得分:0)

如果您创建新的CAShapeLayer,那么在该图层上调用removeFromSuperlayer就没有意义了。您只能对之前已添加为某个其他图层的子图层的图层执行此操作。因此,请勿使用刚刚创建的新图层调用removeFromSuperlayer,但请保存对前一图层的引用。这是你应该删除的那个。

或者,正如德米特里指出的那样,你应该只添加一次形状图层,然后更新它的路径:

private var shapeLayer: CAShapeLayer = {
    let shapeLayer = CAShapeLayer()
    shapeLayer.fillColor = UIColor.red.cgColor
    shapeLayer.opacity = 0.2
    shapeLayer.strokeColor = UIColor.red.cgColor
    shapeLayer.lineWidth = 1.0
    return shapeLayer
}()

// add this to your view's layer in the logical place, e.g. `viewDidLoad` 

override func viewDidLoad() {
    super.viewDidLoad()

    view.layer.addSublayer(shapeLayer)
}

// now your draw method only needs to update the path

private func drawObj() {
    let objectPath = UIBezierPath()

    objectPath.move(to: CGPoint(x: pointsX[0], y: pointsY[0]))

    for i in 1 ..< pointsX.count {
        objectPath.addLine(to: CGPoint(x: pointsX[i], y: pointsY[i]))
    }

    objectPath.close()

    shapeLayer.path = object.cgPath
}

注意,我还更新了形状图层的lineWidthstrokeColor,这样如果只有两个点并且没有任何内容可以填充&#34; ,你至少可以看到描边路径。

答案 1 :(得分:0)

无需从父图层中删除旧CAShapeLayer并插入新图层。只需创建一个CAShapeLayer,将其插入父层。然后只需更新“路径”&#39;需要更改时的参数。