我在UIView的layer属性中画了几行。
但是,有没有一种方法可以清除我绘制的所有线条?

我想清除在视图层上绘制的所有内容。

我用以下代码画一条线:

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

我找到了一些代码来删除我绘制的所有子层。
-(void)clearGraph :(UIView *)viewToClear
{
    for (CALayer *layer in viewToClear.layer.sublayers) {
        [layer removeFromSuperlayer];
    }
}

但这会产生异常:
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)

我在NSTread内调用画线方法。 (具体来说是doParsing方法)。
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];
}

最佳答案

使用当前上下文和矩形调用CGContextClearRect进行清除。

根据更新的代码,您实际上并没有绘制任何内容。您实际上是在添加子层。因此,要删除任何先前的行,您需要删除子层。您将需要想出一种方法来找到适当的子层(也许拥有一个属性,也许通过标签),然后就可以像添加它一样将其删除。

不要自己执行循环,请执行数组操作:

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

07-27 22:23