2010-01-16 12 views
0

J'ai écrit une fonction qui dessine x nombre de carrés dans une position aléatoire toutes les 2 secondes. Un carré ne peut être tiré deux fois dans la même position. Une fois que l'application a terminé un cycle, la grille sera remplie. Maintenant, cela fonctionne bien lorsque le nombre de carrés est < = 8, mais quand cela est plus élevé, un carré est tiré au hasard dans la même position qu'un carré précédent. Au lieu de dessiner un carré dans une position aléatoire, j'ai essayé de les dessiner de haut en bas et cela fonctionne parfaitement.Problème avec setNeedsDisplayInRect (quartz2d, ​​iPhone)

J'ai débogué cela pendant quelques jours et je crois que le problème réside avec setNeedsDisplayInRect.

J'espère que quelqu'un peut vous aider. Désolé si je glosé, ça devient en retard et ma tête est écrasé, lol :)

est le code ci-dessous ....

- (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]; 

}

Répondre

0

Je ne sais pas pourquoi cela a déjà fonctionné; il me semble que tous vos appels à set-setNeedsDisplayInRect seront fusionnés en une seule mise à jour. Je suppose que vous aimeriez que l'apparition de chaque carré «éclate», l'un après l'autre?

Si tel est le cas, vous devez donner le temps OS pour faire défiler la boucle d'événements (ces appels ne forcer une mise à jour de l'écran après le cycle de l'événement en cours.)

Vous devez passer votre boucle dans une séparée et appelez-le avec un -performSelector: withObject: afterDelay: ou un NSTimer.

+0

Sanglante, c'était aussi simple que ça. J'ai passé des heures à le déboguer, merci pour votre sagesse. – Carl