2010-01-07 5 views
2

J'appelle setNeedsDisplayInRect d'une fonction NSTimer toutes les deux secondes. Cela fonctionne parfaitement, et dessine un carré dans une position aléatoire, avec une couleur aléatoire. Cependant, dans certaines circonstances je voudrais dessiner un carré x nombre de fois dans la fonction NSTimer (en utilisant une boucle for) - mais après de nombreux tests d'erreur, il semble que drawRect ne soit appelé qu'une seule fois même si je cours setNeedsDisplayInRect x fois? J'aimerais beaucoup de l'aide que j'ai essayé de comprendre ce problème toute la journée. Carl.iPhone: drawRect appelé une fois

Modifier ci-dessous est mon code ...

Voir

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(context, 2.0); 
    CGContextSetStrokeColorWithColor(context, currentColor.CGColor); 
    CGContextSetFillColorWithColor(context, currentColor.CGColor); 
    CGContextAddRect(context, redrawRect); 
    CGContextDrawPath(context, kCGPathFillStroke); 
} 

-(void)drawInitializer 
{ 
    int x = (int)arc4random() % [self.xCoordinates count]; 
    int y = (int)arc4random() % [self.yCoordinates count]; 
    self.currentColor = [UIColor randomColor]; 
    self.redrawRect = CGRectMake ([[self.xCoordinates objectAtIndex:x] intValue],  [[self.yCoordinates objectAtIndex:y] intValue], 25, 25); 
    [self setNeedsDisplayInRect:redrawRect]; 
} 

Contrôleur

- (void) handleTimer: (NSTimer *) timer 
{ 
    for(int i=0; i<5; i++) 
    { 
     [self.squareView drawInitializer]; 
    } 
} 
+2

il n'est pas redessiné avant le prochain passage dans la boucle d'exécution. – Wevah

+0

Wevah est correct. Vous appelez -setNeedsDisplayInRect: cinq fois dans une boucle serrée, mais le redessin ne se produira pas tant que vous n'aurez pas atteint la fin de la boucle d'exécution. –

Répondre

1

Vous pouvez factoriser le code afin que vous ayez une classe simple cela:

    couleur
  • magasins
  • position stocke
  • a une méthode pour générer des positions aléatoires, les couleurs, ...

Vous pouvez ensuite créer autant d'instances que vous le souhaitez et les pousser dans un NSMutableArray .
De cette façon, vous pouvez parcourir cette liste et dessiner chaque objet dans votre routine de dessin.
Chaque fois que vous ajoutez/supprimer/modifier un de vos objets, appelez setNeedsDisplay:

+0

merci, fonctionne comme un régal :) – Carl

0

vous pouvez créer une classe qui a la capacité de se dessiner, créer autant instances de cette classe que vous avez besoin. `-setNeedsDisplay:` ne marque qu'une vue ayant besoin d'être redisplay;

Questions connexes