[Résolu] NSTimer paramètre d'arrêt

iLandesiLandes Membre
septembre 2016 modifié dans Objective-C, Swift, C, C++ #1

Bonjour,


 


Pour créer une petite animation j'ai besoin d'utiliser un NSTimer qui appel un selector disons toutes les 0.1 mais qui s'arrête après 5 secondes.


 


Je m'arrache les cheveux


Mots clés:

Réponses

  • Tu peux implémenter un compteur qui arrivé à  5/0.1 annule le timer, non ?
  • Bah oui c'est ce que j'ai fait. Merci


     


    Je voulais tout faire d'un seul coup  ;D  ;D


  • Oui :-) Du genre



    + (NSTimer * _Nonnull)timerWithTimeInterval:(NSTimeInterval)seconds 
    target:(id _Nonnull)target
    selector:(SEL _Nonnull)aSelector 
    userInfo:(id _Nullable)userInfo 
    repeats:(BOOL)repeats
    stopAfter:(NSTimeInterval)seconds 

    ;-)

  • CéroceCéroce Membre, Modérateur


    Pour créer une petite animation j'ai besoin d'utiliser un NSTimer qui appel un selector disons toutes les 0.1 mais qui s'arrête après 5 secondes.




    Et sinon, pourquoi ne pas utiliser Core Animation ?

  • J'ai utiliser PaintCode pour la création de ma View. Dans PaintCode on peut implémenter des variables qui changent le dessin généré avec des UIBezierPath en fonction de variables définies dans PaintCode.


     


    A ce jour c'est le seul moyen que j'ai trouvé pour reproduire une animation : redessiné la View en ajustant petit à  petit les variables. Mais peut-être y a-t-il une autre solution avec Core Animation mais je ne maitrise pas cette API.


  • CéroceCéroce Membre, Modérateur

    Un problème de ton approche actuelle est qu'elle redessine la vue à  chaque changement. Pour l'exemple des aiguilles de ton compteur, il vaudrait mieux dessiner l'aiguille droite dans une UIView une seule fois, puis animer la UIView. On peut tout à  fait dessiner l'aiguille dans -drawRect: avec ton code PaintCode.


     


    UIView est adossée à  une CALayer, qui est un "cache" sous la forme d'une texture OpenGL Metal. Une fois l'image chargée dans le GPU, le dessin est super simple pour elle: il suffit de spécifier le rectangle dans laquelle est dessinée la texture.


     


    NSTimer a un gros défaut: il s'exécute sur le thread principal, sans aucune garantie de précision. Déjà , il vaut mieux utiliser un CADisplayLink, plus adapté, et qui est calé sur l'interruption VBL.


     


    Ensuite, un autre intérêt de Core Animation concerne les courbes d'animations. Les déplacements à  vitesse régulière ne sont pas naturels, et donc déplaisants à  l'oe“il. En utilisant une courbe Ease In, Ease Out, ou Ease In Out, c'est beaucoup mieux. Core Animation gère ça tout seul, avec la meilleure granularité possible (tous les 1/60 s), alors que dans ton exemple, tu n'animes que tous les 1/10 de s.


     


    Core Animation n'est pas très simple à  utiliser, mais utiliser les méthodes d'animations de UIView l'est.


  • Merci pour vos réponses.


     


    La semaine prochaine je me rends à  #FrenchKit, j'ai vu qu'il y avait qq chose sur les UIView dans Playground. Je vais approfondir cela pour la prochaine release. Là  je bosse dans l'urgence pour que mon application ne soit pas retiré du store à  cause de RingGraph.


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