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

iOS - How To Remove Previously Added Sublayers Of a UIView

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

我试过这样做:

self.layer.sublayers = nil;

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

有什么办法可以实现吗?还是我每次都必须重新初始化一个新的自定义视图?

注意:应用程序在 iOS 7 及更高版本中运行。

谢谢!

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

代码如下:

对象 C:

[thesublayer removeFromSuperlayer]

Swift:

thesublayer.removeFromSuperlayer()

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

另一种从超级层中删除特定层的方法是在 layer.name 属性 中分配唯一的字符串。您可以稍后进行比较以识别并将其删除。

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

我在 Swift 3 中使用 popLast() 做到了。

self.layer.sublayers?.popLast()

首先你应该给子层添加一个名字 theLayer.name 属性

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

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

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

resultImageView.layer.sublayers?.filter{ [=10=] is CAShapeLayer }.forEach{ [=10=].removeFromSuperlayer() }

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

这是我删除 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];
    }
}
view.layer.sublayers?.forEach { [=10=].removeFromSuperlayer() }

最安全答案的混合:

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

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

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

self.layer.sublayers?
    .filter { [=11=].name == self.shapeName }
    .forEach { [=11=].removeFromSuperlayer() }