0

2秒ごとにx個の正方形をランダムな位置に描画する関数を作成しました。同じ位置に正方形を 2 回描くことはできません。アプリがサイクルを完了すると、グリッドが塗りつぶされます。これで、描画される正方形の数が <=8 の場合は問題なく動作しますが、これより多い場合は、前の正方形と同じ位置に正方形がランダムに描画されます。

正方形をランダムな位置に描画する代わりに、上から下に描画しようとしましたが、これは完全に機能します。

これを数日間デバッグしてきましたが、問題はsetNeedsDisplayInRectにあると思います。

誰かが助けてくれることを願っています。取り乱してすみません、遅くなって頭がつぶれてしまいました、笑:)

以下はコードです....

- (void)drawRect:(CGRect)rect {
int count = [writeSquares count];

CGContextRef context = UIGraphicsGetCurrentContext();

int radius = 4;

for (int i = 0; i <count; i++)
{
    Square *square = [writeSquares objectAtIndex: i];

    CGContextSetLineWidth(context, 1);
    //CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextSetFillColorWithColor(context, [square color].CGColor);
    CGContextMoveToPoint(context, CGRectGetMinX([square squareRect]) + radius, CGRectGetMinY([square squareRect]));
    CGContextAddArc(context, CGRectGetMaxX([square squareRect]) - radius, CGRectGetMinY([square squareRect]) + radius, radius, 3 * M_PI / 2, 0, 0);
    CGContextAddArc(context, CGRectGetMaxX([square squareRect]) - radius, CGRectGetMaxY([square squareRect]) - radius, radius, 0, M_PI / 2, 0);
    CGContextAddArc(context, CGRectGetMinX([square squareRect]) + radius, CGRectGetMaxY([square squareRect]) - radius, radius, M_PI / 2, M_PI, 0);
    CGContextAddArc(context, CGRectGetMinX([square squareRect]) + radius, CGRectGetMinY([square squareRect]) + radius, radius, M_PI, 3 * M_PI / 2, 0);  
    CGContextClosePath(context);
    CGContextFillPath(context);

    //NSLog(@"x = %f x = %f", CGRectGetMaxX([square squareRect]), CGRectGetMinX([square squareRect]));
}

//NSLog(@"Count %i", [writeSquares count]);

[writeSquares removeAllObjects];

}

-(void)drawInitializer:(int) counter{

if(extra != 0) {
    [self setNeedsDisplay];
    [grid removeAllObjects];
    [self calculateGrid];
    counter = counter + extra;
    clear = YES;
    extra = 0;
}

for(int i=0; i<counter; i++) {
    int count = [grid count];
    NSLog(@"counter %i", count);
    if(count != 144) {
        srandom(time(NULL));
        int r = random() % [coordinates count];

        Coordinate *coordinate = [coordinates objectAtIndex:r];


        Square *square = [Square new];
        [square setSquareRect: CGRectMake ([coordinate x] * 25, [coordinate y] * 25, 20, 20)];
        [square setColor: [UIColor randomColor]];
        [writeSquares addObject:square];
        [grid addObject:square];
        [square release];

        [self setNeedsDisplayInRect:CGRectMake ([coordinate x] * 25, [coordinate y] * 25, 20, 20)];

        [coordinates removeObjectAtIndex:r];
        [coordinate release];
    }
    else {
        extra++;
    }
}

//[newlock release];

}

4

1 に答える 1

0

なぜこれがうまくいったのかわかりません。すべての-setNeedsDisplayInRect:呼び出しが1つの更新に統合されるように思われます。それぞれの正方形が次々と「飛び出してくる」ように見せたいと思いますか?

この場合、OSにイベントループを循環させる時間を与える必要があります(これらの呼び出しは、現在のイベントサイクルの後にのみ画面の更新を強制します)。

ループを別のメソッドに移動し、-performSelector:withObject:afterDelay:またはNSTimerのいずれかを使用して呼び出す必要があります。

于 2010-01-17T01:00:55.427 に答える