iOS clair couche de UIView
J'ai dessiné quelques lignes dans la propriété de calque de mon UIView
.
Mais est-il une méthode pour nettoyer toutes les lignes que j'ai dessiné?
Je veux effacer tout ce qui est dessiné sur la couche de mon point de vue.
J'ai dessiner une ligne avec le code suivant:
- (void)drawLine :(UIView *)drawInView :(CGPoint)startPosition :(CGPoint)endPosition
{
//draw the line
linePath = CGPathCreateMutable();
lineShape = [CAShapeLayer layer];
lineShape.lineWidth = 1.0f;
lineShape.lineCap = kCALineCapRound;;
lineShape.strokeColor = [[UIColor whiteColor] CGColor];
CGPathMoveToPoint(linePath, NULL, startPosition.x, startPosition.y);
CGPathAddLineToPoint(linePath, NULL, endPosition.x, endPosition.y);
lineShape.path = linePath;
CGPathRelease(linePath);
[drawInView.layer addSublayer:lineShape];
}
J'ai trouvé un code pour supprimer tous les sous-couches j'ai dessiné.
-(void)clearGraph :(UIView *)viewToClear
{
for (CALayer *layer in viewToClear.layer.sublayers) {
[layer removeFromSuperlayer];
}
}
Mais cela donnera une Exception:
2013-08-28 21:10:18.877 ServerInfo[12861:3f03] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CALayerArray: 0x1f86b3b0> was mutated while being enumerated.'
*** First throw call stack:
(0x336ef3e7 0x3b3ea963 0x336eeec1 0x13f7d 0x158bb 0x340082fb 0x336c4857 0x336c4503 0x336c3177 0x3363623d 0x336360c9 0x33f5a5c3 0x33ffdc45 0x15843 0x34007231 0x3b8370e1 0x3b836fa8)
libc++abi.dylib: terminate called throwing an exception
(lldb)
J'appelle ma méthode drawline à l'intérieur d'un NSTread. (doParsing méthode pour être précis).
NSThread *myThread =[[NSThread alloc]initWithTarget:self selector:@selector(callTimer) object:nil];
[myThread start];
- (void)callTimer
{
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(doParsing) userInfo:nil repeats:YES];
[runLoop run];
}
OriginalL'auteur Jasper Fioole | 2013-08-28
Vous devez vous connecter pour publier un commentaire.
Appel
CGContextClearRect
avec le contexte actuel et de l'rect pour effacer.Basée sur la mise à jour de votre code, vous n'êtes pas réellement dessiner quoi que ce soit. Vous êtes en fait l'ajout de sous-couches. Donc, pour enlever toute la ligne précédente, vous devez supprimer la sous-couche. Vous aurez besoin de trouver un moyen de trouver la bonne sous couche (peut-être tenir une propriété, peut-être par tag) et puis vous pouvez le supprimer comme vous l'ajouter.
Ne pas effectuer la boucle de vous-même, obtenir le tableau de le faire:
Merci pour votre réponse vous a ouvert les yeux. J'ai créé une boucle for qui efface chaque couche mais puis-je obtenir une erreur <CALayerArray: 0x1f092260> a été muté, tout en étant dénombrés". C'est probablement ce qui se passe parce que j'ai ajouter une nouvelle ligne juste après la libération. Des Idées?
Si vous êtes en boucle sur un tableau et que vous ne pouvez pas la modifier. Prendre une copie du tableau et parcourir plus de cela.
Que voulez-vous dire exactement? J'ai mis à jour mon code, peut-être que cela vous aide à comprendre ce que je fais, merci.
Pourquoi vous faites ça sur un thread d'arrière-plan? Toutes les mises à jour de l'INTERFACE utilisateur doit être faite sur le thread principal.
OriginalL'auteur Wain
Un moyen beaucoup plus simple pour supprimer tous les sous-couches d'une UIView est à l'ensemble de ses sous-couches de la propriété à néant
OriginalL'auteur Erwan
J'ai utilisé quelque chose de très similaire à Erwan de réponse.. mais il s'est avéré que je n'avais pas besoin de la 'couche' de la partie. Voici ce qui a fonctionné pour moi. Petit mais efficace.
imageLayer.sublayers = nil;
OriginalL'auteur Dave Levy