2010-01-16 2 views
0

Я написал функцию, которая рисует x число квадратов в случайной позиции каждые 2 секунды. Квадрат нельзя рисовать в одном и том же положении дважды. Как только приложение завершит цикл, сетка будет заполнена. Теперь это отлично работает, когда количество рисованных квадратов равно < = 8, однако, когда это выше, квадрат случайным образом втягивается в ту же позицию, что и предыдущий квадрат.Проблема с setNeedsDisplayInRect (quartz2d, ​​iPhone)

Вместо того, чтобы рисовать квадрат в случайном положении, я попытался рисовать их сверху, и это работает отлично.

Я отлаживал это в течение нескольких дней, и я считаю, что проблема кроется в 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]; 

}

ответ

0

Я не знаю, почему это когда-либо работало; мне кажется, что все ваши вызовы -setNeedsDisplayInRect: вызовы будут объединены в одно обновление. Я предполагаю, что вы хотите, чтобы каждый квадрат «появлялся» один за другим?

Если это так, то вам нужно дать OS время цикла его цикл событий (эти вызовы будут только принуждать обновление экрана после текущего цикла событий.)

Вы должны переместить петлю в отдельный метод и вызовите его либо с помощью -performSelector: withObject: afterDelay: или NSTimer.

+0

Кровавый ад, все было так просто. Я потратил часы на отладку, спасибо за вашу мудрость. – Carl