Rud*_*ger 14 iphone calayer uiview
我添加了渐变图层:
[theView.layer insertSublayer:gradient atIndex:0];
Run Code Online (Sandbox Code Playgroud)
后来在另一种方法中我想删除这一层.我想我应该得到子层数组,然后在索引0处获得子层并在其上调用removeFromSuperlayer.这是正确的方法,如果没有,你能做到吗?
干杯.
Jer*_*ner 17
你可以按照你描述的方式做到,但它不那么可靠.问题是如果你在添加和删除之间对子层进行任何操作,子层的索引可能会改变,你最终会删除你不想要的东西.
最好的办法是保留对该图层的引用,稍后当您要删除它时,只需调用即可 [theLayer removeFromSuperlayer]
希望能帮助到你
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个字节是单个像素使用的内存!).
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)
Run Code Online (Sandbox Code Playgroud)
请记住,子层被视为一个数组,因此如果您的计数为 2,则索引中的 2 == 1,因此removeAtIndex(1)
.
有一整套选项可用于编辑子图层。只需停止输入sublayers!.
并检查它们。
旧帖子..但这可能对某人有帮助......
我删除/替换 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];
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13896 次 |
最近记录: |