我添加了渐变图层:
[theView.layer insertSublayer:gradient atIndex:0];
后来在另一种方法中,我想删除这一层。我想我应该得到子层数组,然后在索引0处获得子层并在其上调用removeFromSuperlayer。这是正确的方法,如果没有,你能做到吗?
干杯。
答案 0 :(得分:17)
你可以按照你描述的方式做到,但它不那么可靠。问题是如果你在添加和删除之间对子层进行任何操作,子层的索引可能会改变,你最终会删除你不想要的东西。
最好的办法是保留对该图层的引用,稍后当您要删除它时,只需致电[theLayer removeFromSuperlayer]
希望有所帮助
答案 1 :(得分:9)
... Funfunfun
您可以使用两种图层属性(在任何一种情况下,您都必须遍历图层):
CALayer.name
“来标识图层”。将其设置为合理保证是唯一的(例如“MyClassName.gradient”)。CALayer.style
是一本字典。您可以使用CoreAnimation未使用的密钥(例如NSMutableDictionary * d = [NSMutableDictionary dictionaryWithDictionary:layer.style]; [d setValue:[NSNumber numberWithBool:YES] forKey:@"MyClassName.gradient"]; layer.style = d;
)。这可能有助于将任意数据与视图相关联(例如包含文本字段的单元格的索引路径......)。(我假设[NSDictionary dictionaryWithDictionary:nil]
返回空字典而不是返回nil或抛出异常。[NSArray arrayWithArray:nil]
也是如此。)
然而,额外的代码复杂性,性能损失和错误的可能性可能超过内存使用量的小幅下降。如果您有少量视图,则每个视图4个字节并不多(即使您有加载,4个字节是单个像素使用的内存!)。
答案 2 :(得分:3)
Old Post ..但这可能对某人有帮助......
我删除/替换CALayer的实现。使用Calayer.name作为tc。如上所述。
CAGradientLayer *btnGradient = [CAGradientLayer layer];
btnGradient.frame = button.bounds;
btnGradient.name = @"gradient";
btnGradient.colors = nil;
btnGradient.colors = [NSArray arrayWithObjects:
(id)[[VOHelper getButtonColor:kSchemeBorder] CGColor],
(id)[[VOHelper getButtonColor:kSchemeButton] CGColor],
nil];
if ([[[[button.layer sublayers] objectAtIndex:0] name] isEqualToString:@"gradient"]){
[button.layer replaceSublayer:[[button.layer sublayers] objectAtIndex:0] with:btnGradient];
}
else{
[button.layer insertSublayer:btnGradient atIndex:0];
}
答案 3 :(得分:3)
Swift有一些非常简单的解决方案:
// SWIFT 4 update
func removeSublayer(_ view: UIView, layerIndex index: Int) {
guard let sublayers = view.layer.sublayers else {
print("The view does not have any sublayers.")
return
}
if sublayers.count > index {
view.layer.sublayers!.remove(at: index)
} else {
print("There are not enough sublayers to remove that index.")
}
}
// Call like so
removeSublayer(view, layerIndex: 0)
请记住,子图层被视为一个数组,因此,如果您的计数为2,则索引中的2 == 1,因此removeAtIndex(1)
。
有一大堆选项可用于编辑子图层。只需在sublayers!.
之后停止输入并查看它们即可。
答案 4 :(得分:0)
雨燕4
self.view.layer.sublayers = self.view.layer.sublayers?.filter { theLayer in
!theLayer.isKind(of: CAGradientLayer.classForCoder())
}