2

私のコードでは、線の描画の遅延を「アニメーション化」したいので、ビューに新しい線を追加した後、setNeedsDisplay を呼び出します。これは 1 回で問題なく動作します。

drawRect メソッド内で線を描画し、線のメソッドを呼び出して線の長さをインクリメントします。今度は setNeedsDisplay をもう一度呼び出して線を再描画したいので、「成長」のアニメーションを取得します..

しかし、別の行を追加しない限り、setNeedsDisplay は 1 回だけ呼び出され、二度と呼び出されません。また、setNeedsDisplay を呼び出すこのクラスのメソッドを呼び出して、drawRect 内で呼び出すことができないようにしようとしました。

- (void)drawRect:(CGRect)rect {

    for(GameLine *line in _lines) {

        if(line.done) {
            CGContextRef c = UIGraphicsGetCurrentContext();
            CGContextSetLineWidth(c, 5.0f);
            CGContextSetStrokeColor(c, lineColor);

            CGContextBeginPath(c);
            CGContextMoveToPoint(c, line.startPos.x, line.startPos.y);
            CGContextAddLineToPoint(c, line.endPos.x, line.endPos.y);
            CGContextStrokePath(c);
        }else {
            CGContextRef c = UIGraphicsGetCurrentContext();
            CGContextSetLineWidth(c, 5.0f);
            CGContextSetStrokeColor(c, delayColor);

            CGContextBeginPath(c);
            CGContextMoveToPoint(c, line.delayStartPos.x, line.delayStartPos.y);
            CGContextAddLineToPoint(c, line.delayEndPos.x, line.delayEndPos.y);
            CGContextStrokePath(c);

            [line incrementDelayLine];
            [self setNeedsDisplay];
        }
    }
}

_linesは、GameLine オブジェクト (非アトミック、保持) プロパティを持つ NSMutableArray です。

4

2 に答える 2

5

期待されています。

setNeedsDisplay を呼び出すときに、ビューを再描画が必要であるとマークします。わかった。システムはそれを取得します。
そして、次にアプリのメイン ループが実行されるときに実行されます

ビューを本当にリフレッシュしたい場合は、次のように呼び出します。

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate: [NSDate date]];

直後setNeedsDisplay

確かに、アップルのドキュメントには次のように記載されています(強調は私のものです):

ビューの実際のコンテンツが変更された場合、ビューを再描画する必要があることをシステムに通知するのは、ユーザーの責任です。これを行うには、ビューのsetNeedsDisplayまたは setNeedsDisplayInRect: メソッドを呼び出します。これらのメソッドは、次の描画サイクル中にビューを更新する必要があることをシステムに知らせます。ビューの更新は次の描画サイクルまで待機するため、複数のビューでこれらのメソッドを呼び出して同時に更新することができます。

また、次の SO の質問も参照してください。

于 2013-04-04T20:27:25.427 に答える