Animer un changement de couleur quand -drawRect: est utilisée

colas_colas_ Membre
juillet 2014 modifié dans API UIKit #1

Bonjour !


 


Je découvre les animations. Pour l'instant, tout ce que je connais est [UIView animate...]. Cette méthode ne marche pas me semble-t-il pour animer des @property animables, lorsque des changements  sont faits via CoreGraphics.


 


Confirmez-vous cela ?


 


Y a-t-il moyen de faire autrement (dans mon cas, je veux changer la backgroundColor) ?


 


Plus précisément, voici ce que je fais dans drawRect: (je dessine un pdf)



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

CGContextGetCTM(ctx);
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -rect.size.height);

CGContextScaleCTM(ctx,
rect.size.width / self.page.size.width,
rect.size.height / self.page.size.height);

CGContextDrawPDFPage(ctx, self.page.coreObject);
}

et voici mon animation :



[UIView animateWithDuration:3
animations:^{
view.backgroundColor = [UIColor blueColor] ;
}];

Le changement de couleur marche mais sans animation :(


 


 


Si vous avez des pistes de recherche, je suis preneur !


 


 


PS : je précise que dans le cas qui m'intéresse, si j'efface le -drawRect: l'animation marche


 


PS2 : si j'utilise 



CGContextSetRGBFillColor(ctx, 1, 1, 1, 1);
CGContextFillRect(ctx, rect);

dans la méthode -drawRect: pour setter la couleur, ça ne marche pas non plus.


Réponses

  • PyrohPyroh Membre
    juillet 2014 modifié #2

    J'ai peur qu'il ne faille utiliser Core Animation et les CALayer pour faire ça.


    Ou alors faire une animation explicite (CAAnimation, existe sur iOS ?) qui te permet de dégrader une couleur vers une autre et qui appelle drawRect à  intervalles réguliers.


  • CéroceCéroce Membre, Modérateur
    Que se passe-t-il si tu écris:


    - (void)drawRect:(CGRect)rect
    {
    [super drawRect:rect];
    ...
    Je pensais que la couleur de fond de la vue était en fait appliquée sur la CALayer, mais d'après ce que tu décris, ce n'est pas le cas.

    Sinon, il te reste deux solutions:
    - attaquer directement la layer qui possède une propriété backgroundColor.
    - mettre ta vue dans une autre vue qui servira uniquement à  fixer la couleur de fond. Cette solution aurait ma préférence.
  • @Céroce : "- mettre ta vue dans une autre vue qui servira uniquement à  fixer la couleur de fond. Cette solution aurait ma préférence." --> je pense que ça ne va pas marcher. Une fois le drawRect: fait (à  partir du pdf), la vue en dessous n'est plus visible. Même si je ne mets pas de couleur de fond, le fond est blanc et pas transparent.


     


     


    Finalement, j'ai l'impression que cette méthode marche :



    [UIView transitionWithView:myView duration:1
    options:UIViewAnimationOptionTransitionCrossDissolve
    animations:^{
    //do changes here
    } completion:nil];

    J'ai trouvé cette méthode sur SO.


  • CéroceCéroce Membre, Modérateur

    @Céroce : "- mettre ta vue dans une autre vue qui servira uniquement à  fixer la couleur de fond. Cette solution aurait ma préférence." --> je pense que ça ne va pas marcher. Une fois le drawRect: fait (à  partir du pdf), la vue en dessous n'est plus visible. Même si je ne mets pas de couleur de fond, le fond est blanc et pas transparent.

    Si c'était le cas, alors même sans animation, on ne pourrait pas changer la couleur de fond.


  • Si c'était le cas, alors même sans animation, on ne pourrait pas changer la couleur de fond.




    Oui, tu dois avoir raison.


    Ce que j'ai testé, c'est la vue PDF par dessus une autre vue (et non dans une autre vue).

Connectez-vous ou Inscrivez-vous pour répondre.