Question

Je suis en train de mettre en œuvre une ligne de dessin très simple animation pour mon application iPhone. Je voudrais dessiner un rectangle sur mon point de vue après un délai. J'utilise performSelector pour exécuter ma méthode de dessin.

-(void) drawRowAndColumn: (id) rowAndColumn
{
    int rc = [rowAndColumn intValue];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 2.0);
    CGContextSetStrokeColorWithColor(context, currentColor.CGColor);
    CGRect rect = CGRectMake(rc * 100, 100, 100, 100);
    CGContextAddRect(context, rect);
    CGContextDrawPath(context, kCGPathFillStroke);

}

Quelle est alors invoquée par:

int col = 10;
[self performSelector:@selector(drawRowAndColumn:) 
           withObject:[NSNumber numberWithInt:col]
           afterDelay:0.2];

Mais il semble que lorsque le message drawRowAndColumn: est effectivement envoyé, il n'a plus accès à un CGContextRef valide, que je reçois des erreurs telles que:

<Error>: CGContextAddRect: invalid context

Si je remplace le performSelector par un appel direct à drawRowAndColumn, il fonctionne très bien. Ma première idée était de passer aussi dans le CGContextRef via le performSelector, mais je ne peux pas à comprendre comment passer plusieurs arguments en même temps (c'est une autre bonne question.)

Quel est le problème avec le code ci-dessus?

Était-ce utile?

La solution

Vous ne pouvez pas tirer à tout moment comme ça. Vous devez implémenter la méthode drawRect: de UIView et de mettre votre code de dessin là-dedans. Pour obtenir drawRect: vous feu devez laisser Cocoa savoir que la vue doit être établi. Pour cela, vous pouvez appeler setNeedsDisplay ou setNeedsDisplayInRect:.

directement la traduction de votre tentative de cette façon que vous appelez à l'aide setNeedsDisplay performSelector withObject: afterDelay - mais c'est probablement pas une bonne façon de faire de l'animation

.

Cela dépend de ce que vous êtes vraiment essayer de le faire - mais vous pourriez envisager, par exemple, mettre votre code de dessin dans drawRect comme je l'ai suggéré, mais commencer à la vue cachée. Vous pouvez ensuite appeler setHidden: NON à l'aide performSelector pour le faire apparaître après un délai - ou vous pouvez affiner la transition en en commençant pas caché, mais avec un alpha de 0, puis changer alpha 1 dans un bloc d'animation UIView (il y a beaucoup à propos de cela dans les docs).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top