我正在创建一个应用程序,它应该从触摸点绘制对象。
我正在使用CAShapeLayer
和UIBezierPath
,但是当我使用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)
}
答案 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
}
注意,我还更新了形状图层的lineWidth
和strokeColor
,这样如果只有两个点并且没有任何内容可以填充&#34; ,你至少可以看到描边路径。
答案 1 :(得分:0)
无需从父图层中删除旧CAShapeLayer并插入新图层。只需创建一个CAShapeLayer,将其插入父层。然后只需更新“路径”&#39;需要更改时的参数。