删除索引0处的CALayer

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]

希望能帮助到你


tc.*_*tc. 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个字节是单个像素使用的内存!).


App*_*Guy 6

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!.并检查它们。


nab*_*nab 5

旧帖子..但这可能对某人有帮助......

我删除/替换 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)