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() }
我有一个自定义视图,它是 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() }