删除所有CALayer的子图层

rad*_*dex 59 cocoa core-animation objective-c

删除所有图层的子图层时遇到问题.我目前手动执行此操作,但这会带来不必要的混乱.我在谷歌找到了很多关于这方面的话题,但没有答案.

我试着这样做:

for(CALayer *layer in rootLayer.sublayers)
{
    [layer removeFromSublayer];
}

但它不起作用.

此外,我试图将rootLayer.sublayers克隆到单独的NSArray中,但结果是相同的.

有任何想法吗?

编辑:

我觉得它现在有效,但我错了.它适用于CALayers,但它不适用于CATextLayers.有任何想法吗?

Pas*_*que 125

从图层中删除所有子图层的最简单方法是将子图层属性设置为nil:

rootLayer.sublayers = nil;

  • 这完全导致崩溃和混乱. (14认同)
  • 不要这样做.它会在事件发生后导致随机崩溃. (11认同)
  • 我很高兴这个解决方案没有触发任何"集合在被枚举时被突变"异常,但我担心也许子层的'superlayer`属性可能不会被改变 - 这对我来说是一个问题,因为这些层由另一个控制器拥有.我通过暂时保留ref到其中一个子层(通过`sublayers objectAtIndex:0`)测试了这个,并且可以确认它的`superlayer`属性确实无效. (8认同)
  • 这根本不应该是公认的答案. (7认同)
  • 据我所知,是的(当然,它只是释放子层,只有在没有其他东西保留的情况下才会释放它们). (3认同)

Ben*_*ieb 33

以下应该有效:

for (CALayer *layer in [[rootLayer.sublayers copy] autorelease]) {
    [layer removeFromSuperlayer];
}
Run Code Online (Sandbox Code Playgroud)

  • 您必须使用子图层列表的副本:否则您将在迭代时最终修改列表,这实际上并不十分安全. (7认同)
  • 我最喜欢通过可能删除对象来改变数组的方法是使用for循环向后遍历它:for(int i = rootLayer.sublayers.count-1; i> = 0; i--){[[rootLayer.sublayers objectAtIndex :i] removeFromSuperlayer]; } (2认同)

Tom*_*omH 18

[rootLayer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
Run Code Online (Sandbox Code Playgroud)

  • 我强烈建议先制作一个子层副本,然后按照上面的答案进行删除,否则会像@dbainbridge所说的那样崩溃. (2认同)

ave*_*Joe 13

Swift(短版):

layer.sublayers?.forEach { $0.removeFromSuperlayer() }


Kaf*_*afu 5

调用rootLayer.sublayers = nil;可能会导致崩溃(例如,如果在iOS 8下,您在拥有的视图上调用removeFromSuperview两次rootLayer).

正确的方法应该是:

[[rootLayer.sublayers copy] makeObjectsPerformSelector:@selector(removeFromSuperlayer)]

copy需要调用,以便removeFromSuperlayer不会修改迭代调用的数组,否则会引发异常.