簡體   English   中英

setNeedsDisplayInRect(Quartz2d,iPhone)出現問題

[英]Problem with setNeedsDisplayInRect (quartz2d, iPhone)

我編寫了一個函數,每2秒在隨機位置繪制x個正方形。 正方形不能在相同位置繪制兩次。 一旦應用程序完成一個循環,網格將被填充。現在,當繪制的方格數<= 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];

}

我不知道為什么這個方法能奏效。 在我看來,所有-setNeedsDisplayInRect:調用都將合並為一個更新。 我猜想您會希望每個廣場的外觀都在“彈出”嗎?

在這種情況下,您需要給操作系統時間循環其事件循環(這些調用將僅在當前事件循環之后強制屏幕更新。)

您應該將循環移動到單獨的方法中,然后使用-performSelector:withObject:afterDelay:或NSTimer進行調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM