iOS - 如何删除以前添加的UIView子图层

fin*_*tic 21 calayer uiview ios

我有一个自定义视图,它是一个子类UIView.我在自定义视图中添加了一些子图层,但现在我想删除它们.

我试过这样做:

self.layer.sublayers = nil;
Run Code Online (Sandbox Code Playgroud)

但这会删除所有内容,包括视图的初始子图层.

有没有办法实现这个目标?或者我每次都必须重新初始化一个新的自定义视图?

注意:App在iOS 7及更高版本中运行.

谢谢!

Kir*_*nee 43

从超级图层中删除特定图层的另一种方法是在layer.name属性中指定唯一的字符串.您可以在以后比较以识别并删除它.

for layer in sublayers {
     if layer.name == "masklayer" {
          layer.removeFromSuperlayer()
     }
 }
Run Code Online (Sandbox Code Playgroud)


小智 39

保持对添加的子图层的引用在不需要时从超级图层中删除子图层.

代码如下:

对象C:

[thesublayer removeFromSuperlayer]
Run Code Online (Sandbox Code Playgroud)

迅速:

thesublayer.removeFromSuperlayer()

//thesublayer is the name of the layer you want to remove
Run Code Online (Sandbox Code Playgroud)

  • 我为什么没想到这个... -_-谢谢! (2认同)

Van*_*nya 13

保持引用并不酷,在某些情况下你可以使用

resultImageView.layer.sublayers?.filter{ $0 is CAShapeLayer }.forEach{ $0.removeFromSuperlayer() }
Run Code Online (Sandbox Code Playgroud)

或者通过使用 CALayer 更通用,它删除了所有内容

  • 所有其他解决方案都让我崩溃 - 这个解决方案有效,谢谢! (2认同)

meo*_*w2x 12

我是在Swift 3中使用它做的popLast().

self.layer.sublayers?.popLast()
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,当尝试从Swift 4中的UITextArea中删除子图层时,所有其他解决方案都崩溃了 (2认同)

moh*_*sen 8

首先,您应该为具有theLayer.name属性的子图层添加一个名称

之后,您可以像这样扩展视图:

extension UIView {
    func removeLayer(layerName: String) {
            for item in self.layer.sublayers ?? [] where item.name == layerName {
                    item.removeFromSuperlayer()
            }
        }
}
Run Code Online (Sandbox Code Playgroud)