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

时间:2016-06-02 03:05:29

标签: ios uiview calayer

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

我试过这样做:

self.layer.sublayers = nil;

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

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

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

谢谢!

8 个答案:

答案 0 :(得分:33)

保持对添加的子图层的引用 不需要时从超级层移除子层。

代码如下:

对象C:

[thesublayer removeFromSuperlayer]

夫特:

thesublayer.removeFromSuperlayer()

//thesublayer is the name of the layer you want to remove

答案 1 :(得分:30)

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

for layer in sublayers {
     if layer.name == "masklayer" {
          layer.removeFromSuperlayer()
     }
 }

答案 2 :(得分:8)

我是使用popLast()在Swift 3中完成的。

self.layer.sublayers?.popLast()

答案 3 :(得分:8)

保存参考资料不是很酷,在某些情况下您可以使用

resultImageView.layer.sublayers?.filter{ $0 is CAShapeLayer }.forEach{ $0.removeFromSuperlayer() }

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

答案 4 :(得分:2)

首先,您应该使用theLayer.name属性为子层添加名称

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

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

答案 5 :(得分:0)

这是我删除AVPlayerLayer而不引用它的解决方案:

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];

    // Remove player layer when screen gone
    NSUInteger layerIndex = [self.view.layer.sublayers indexOfObjectPassingTest:^BOOL(__kindof CALayer * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        return [obj isKindOfClass:[AVPlayerLayer class]];
    }];
    if (layerIndex != NSNotFound) {
        AVPlayerLayer *playerLayer = self.view.layer.sublayers[layerIndex];
        [playerLayer removeFromSuperlayer];
    }
}

答案 6 :(得分:0)

view.layer.sublayers?.forEach { $0.removeFromSuperlayer() }

答案 7 :(得分:0)

综合最安全的答案:

首先,在每个添加的子层上设置 name 属性。在这种情况下,添加一个 CAShapeLayer:

private let shapeName = "shape"
let shape = ...
shape.name = shapeName
self.layer.addSublayer(shape)

稍后,仅删除那些命名的子图层:

self.layer.sublayers?
    .filter { $0.name == self.shapeName }
    .forEach { $0.removeFromSuperlayer() }