从父UIView中删除CALayers

jwa*_*502 3 calayer ios swift

有几个问题像这样漂浮,但没有答案可行.

我正在为这样的UIView添加新的CALayers:

    func placeNewPicture() {
        let newPic = CALayer()
        newPic.contents = self.pictureDragging.contents
        newPic.frame = CGRect(x: pictureScreenFrame.origin.x - pictureScreenFrame.width/2, y: pictureScreenFrame.origin.y - pictureScreenFrame.height/2, width: pictureScreenFrame.width, height: pictureScreenFrame.height)
        self.drawingView.layer.addSublayer(newPic)
    }
Run Code Online (Sandbox Code Playgroud)

并试图删除它们:

    func deleteDrawing() {

        for layer in self.drawingView.layer.sublayers {
            layer.removeFromSuperlayer()
        }
    }
Run Code Online (Sandbox Code Playgroud)

这会成功删除图像,但下次触摸屏幕时应用程序会崩溃,调用main但调试器中没有打印任何内容.有几种这样的情况,在删除子图层后,应用程序会在短时间内崩溃.

从父视图中删除CALayers的正确方法是什么?

Leo*_*Leo 8

我认为错误是你删除了所有子图层,而不是你添加的子图层.保留一个属性以保存您添加的子图层

    var layerArray = NSMutableArray()
Run Code Online (Sandbox Code Playgroud)

然后试试

func placeNewPicture() {
    let newPic = CALayer()
    newPic.contents = self.pictureDragging.contents
    newPic.frame = CGRect(x: pictureScreenFrame.origin.x - pictureScreenFrame.width/2, y: pictureScreenFrame.origin.y - pictureScreenFrame.height/2, width: pictureScreenFrame.width, height: pictureScreenFrame.height)
    layerArray.addObject(newPic)
    self.drawingView.layer.addSublayer(newPic)
}
func deleteDrawing() {

    for layer in self.drawingView.layer.sublayers {
        if(layerArray.containsObject(layer)){
            layer.removeFromSuperlayer()
            layerArray.removeObject(layer)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Leo Dabus更新建议,您也可以设置图层名称.

newPic.name = "1234"
Run Code Online (Sandbox Code Playgroud)

然后检查

func deleteDrawing() {

    for layer in self.drawingView.layer.sublayers {
        if(layer.name == "1234"){
            layerArray.removeObject(layer)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您只需为图层设置名称https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/index.html#//apple_ref/occ/instp/CALayer/name (2认同)
  • @LeoDabus感谢您的建议,我会根据您的建议更新我的回答 (2认同)