62 votes

Suppression de toutes les sous-couches de CALayer

J'ai de la difficulté avec la suppression de la totalité de la couche sous-couches. J'ai actuellement le faire manuellement, mais qui apporte inutiles. J'ai trouvé beaucoup de sujets sur ce sujet dans google, mais pas de réponse.

J'ai essayé de faire quelque chose comme ceci:

pour(CALayer *couche dans rootLayer.sous-couches)
{
 [couche removeFromSublayer];
}

mais il ne fonctionne pas.

Aussi, j'ai essayé de cloner rootLayer.les sous-couches séparées, NSArray, mais le résultat était le même.

Des idées?

Edit:

Je pensais que cela fonctionne maintenant, mais j'avais tort. Il fonctionne bien avec CALayers, mais il ne fonctionne pas avec CATextLayers. Des idées?

129voto

Pascal Bourque Points 1774

Le moyen le plus simple de supprimer toutes les sous-couches d'une couche consiste à définir la propriété de sous-couche sur nil:

rootLayer.sublayers = nil;

33voto

Ben Gottlieb Points 59900

Ce qui suit devrait fonctionner:

 for (CALayer *layer in [[rootLayer.sublayers copy] autorelease]) {
    [layer removeFromSuperlayer];
}
 

17voto

TomH Points 1604
[rootLayer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];

3voto

Nestor Points 1133

La suppression indiscriminée de toutes les sous-couches provoque de graves blocages dans iOS 7, qui peuvent se produire beaucoup plus tard au cours de l'exécution du programme. J'ai testé cela de manière approfondie en utilisant à la fois rootLayer.sublayers = nil et [rootLayer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)] . Il doit y avoir une couche créée par le système qui se fausse.

Vous devez conserver votre propre tableau de couches et les supprimer vous-même:

 [myArrayOfLayersIAddedMyself makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
 

2voto

KatokichiSoft Points 676

Que diriez-vous d'utiliser l'énumération inverse?

 NSEnumerator *enumerator = [rootLayer.sublayers reverseObjectEnumerator];
for(CALayer *layer in enumerator) {
    [layer removeFromSuperlayer];
}
 

Parce que le groupe dans les sous-couches est modifié pendant l'énumération, si l'ordre est normal. J'aimerais connaître le résultat du code ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X