2010-04-09 7 views
1

Je suis relativement nouveau sur Objective-C + Quartz et je suis confronté à ce qui est probablement un problème très simple. J'ai une sous-classe personnalisée UIView que j'utilise pour dessiner des rectangles simples via Quartz. Cependant j'essaye de raccorder un NSTimer afin qu'il dessine un nouvel objet chaque seconde, le code ci-dessous dessinera le premier rectangle mais ne dessinera jamais plus. La fonction est appelée (le NSLog est exécuté) mais rien n'est dessiné.Utilisation de Quartz pour dessiner toutes les secondes via NSTimer (iPhone)

code:

- (void)drawRect:(CGRect)rect { 
    context = UIGraphicsGetCurrentContext(); 

    [self step:self]; 
    [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)(2) target:self selector:@selector(step:) userInfo:nil repeats:TRUE]; 

} 

- (void) step:(id) sender { 
    static double trans = 0.5f; 

    CGContextSetRGBFillColor(context, 1, 0, 0, trans); 
    CGContextAddRect(context, CGRectMake(10, 10, 10, 10)); 
    CGContextFillPath(context); 

    NSLog(@"Trans: %f", trans); 

    trans += 0.01; 
} 

contexte est dans mon fichier d'interface:

CGContextRef context; 

Toute aide sera grandement appréciée!

Répondre

2

Votre exemple ne fonctionnera pas. La raison en est que drawRect: est appelée lorsque la vue nécessite un dessin et qu'elle ne peut pas dessiner par elle-même.

Au lieu de cela, essayez d'utiliser votre minuterie à l'extérieur de drawRect: (viewDidLoad vient à l'esprit), et à chaque fois ajouter un objet à dessiner à une liste, et appelez [view setNeedsDisplay] pour lui demander d'être redessinée. Il existe d'autres techniques si vous avez besoin d'un contrôle plus strict, mais c'est une bonne idée de maîtriser les bases du flux d'applications en premier.

+0

Exactement raison. Planifiez la minuterie répétée dans votre méthode 'viewDidLoad', et ayez votre méthode' update' appelée 'setNeedsDisplay'. Vous ne devez pas exécuter de code de dessin en dehors d'une méthode 'drawRect', sauf si vous avez préalablement défini un contexte de dessin. Utiliser celui d'un précédent appel à 'drawRect' ne fonctionnera pas, puisque ce contexte ne sera plus là après que' drawRect' aura fini. –