IOS transparent layer UIView

I drew a few lines in the layer property of my UIView . But is there a way to clear all the lines that I drew?

I want to clear everything that is drawn on the layer of my view.

I draw a line with the following code:

 - (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]; } 

I found code to remove all the sublayers that I drew.

 -(void)clearGraph :(UIView *)viewToClear { for (CALayer *layer in viewToClear.layer.sublayers) { [layer removeFromSuperlayer]; } } 

But this will give an 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) 

I call the drawline method inside NSTread. (the doParsing method must be specific).

 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]; } 
+4
source share
3 answers

Call CGContextClearRect with the current context, and the rectangle will clear.


Based on your updated code, you are not actually drawing anything. In fact, you add sublayers. Thus, in order to remove any previous line, you need to remove the extra layer. You will need to find a way to find the corresponding sublayer (perhaps have a property, perhaps by the tag), and then you can remove it the same way you added it.


Do not run the loop yourself to get an array:

 [viewToClear.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)]; 
+8
source

An easier way to remove all UIView sublayers is to set its sublayers property to nil

 viewToClear.layer.sublayers = nil; 
+10
source

I used something very similar to Erwan's answer .. but it turned out that I did not need the β€œlayer” part. Here is what worked for me. Small but efficient.

imageLayer.sublayers = nil;

+4
source

Source: https://habr.com/ru/post/1499459/


All Articles