我有一个自定义视图,它是UIView
的子类。我在自定义视图中添加了一些子图层,但现在我想删除它们。
我试过这样做:
self.layer.sublayers = nil;
但这将删除所有内容,包括视图的初始子图层。
有没有办法实现这个目标?或者我每次都必须重新初始化一个新的自定义视图?
注意:App在iOS 7及更高版本中运行。
谢谢!
答案 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() }