5

のレイヤープロパティに数本の線を描きましたUIView。しかし、私が描いたすべての線をきれいにする方法はありますか?

ビューのレイヤーに描かれているものをすべてクリアしたい。

次のコードで線を引きます。

- (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 内で drawline メソッドを呼び出します。(具体的には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];
}
4

4 に答える 4

14

UIView のすべてのサブレイヤーを削除するより簡単な方法は、サブレイヤー プロパティを nil に設定することです。

viewToClear.layer.sublayers = nil;
于 2014-10-28T10:17:52.283 に答える
10

CGContextClearRect現在のコンテキストとクリアする rect を指定して呼び出します。


更新されたコードに基づいて、実際には何も描画していません。実際にサブレイヤーを追加しています。したがって、前の行を削除するには、サブレイヤーを削除する必要があります。適切なサブレイヤーを見つける方法を考え出す必要があります (おそらくプロパティを保持するか、タグによって)。その後、追加するのと同じように削除できます。


自分でループを実行しないでください。配列を取得して実行してください。

[viewToClear.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
于 2013-08-28T17:58:39.200 に答える
4

Erwan の応答と非常によく似たものを使用しました..しかし、「レイヤー」部分は必要ないことがわかりました。これが私のために働いたものです。小さいが効果的。

imageLayer.sublayers = nil;

于 2015-07-15T15:04:51.897 に答える