Comment faire un texte défillant

prepa75prepa75 Membre
19:55 modifié dans API AppKit #1
Bonjour à  tous,

je me demandais comment faire pour avoir un texte qui défile dans un label,existe-il une fonction qui le fait facilement ou faut-il utiliser un timer ?? ???

Réponses

  • CéroceCéroce Membre, Modérateur
    19:55 modifié #2
    Oui, il faut utiliser un Timer ou Core Animation.
  • AliGatorAliGator Membre, Modérateur
    mars 2010 modifié #3
    J'avais déjà  fait une classe comme ça qui fait tout ce qu'il faut, et permet même de défiler d'avant en arrière (repart dans l'autre sens quand arrivé au bout)... ou pas.

    J'avais tout fait avec CoreAnimation :
    - ma classe MarqueeLabel dérive de UIView
    - Dans son init, elle se rajoute un UILabel en subview
    - Dans ma méthode setText de cette nouvelle classe, j'affecte le texte passé en paramètre comme texte du UILabel interne, et je calcule la largeur du texte (cf doc "NSString UIKit Addition") pour redimentionner mon UILabel correctement (pour que le texte tienne dedans). Du coup mon UILabel peut tout à  fait être plus large que la UIView dans laquelle il est (sa superview, la MarqueeLabel justement, donc), et c'est très bien justement
    - Dans ma méthode startAnimating, j'utilise CoreAnimation pour animer la modification de la frame du UILabel interne (pour modifier son origine, je la fait passer de x=0 à  un x négatif vallant [tt]self.bounds.size.width - label.bounds.size.width[/tt], en gros). C'est CoreAnimation qui se charge de faire le défilement, moi je fais juste que modifier la frame du label, le reste avec CA est tout automatique :):
    - Une fois l'animation terminée, CoreAnimation me le signale (appel d'une methode delegate, ça aussi c'est prévu dans CoreAnim) et dans ce cas j'avise, par exemple je lance l'animation dans l'autre sens pour remettre le label au début.

    D'ailleurs en réalité je n'appelle même pas directement les méthodes de CoreAnimation et CALayer & co, j'utilise [UIView beginAnimations:... context:...] et [UIView commitAnimations]. Encore plus simple à  manipuler.
  • prepa75prepa75 Membre
    19:55 modifié #4
    :'(

    merci pour ta réponse Ali , mais je suis largué dès la 1ere ligne  :(

    ce que j'ai compris c'est que je dois utiliser CoreAnimation et j'ai prévu de m'y mettre lorsque j'aurai bien géré les classes,ce qui n'est pas encore le cas  :P

    bref je pense réutiliser ta réponse dans quelques temps

    autre question qui en découlle : vous me conseillé quoi comme support (de préférence français...) pour apprendre a utiliser CoreAnimation ?(livres, PDF , forums , tutos...)
  • sekaijinsekaijin Membre
    19:55 modifié #5
    Avec l'artillerie lourde : Quartz Composer
    tu créé une anim avec QC et tu la place dans ton nib
    tu la bind avec la chaine de ton choix

    A+JYT
  • AliGatorAliGator Membre, Modérateur
    mars 2010 modifié #6
    Encore et toujours la doc Apple, qui regorge d'infos sur tout plein de sujets.
    Certes c'est en anglais, mais faut bien maà®triser l'anglais pour faire de la prog :P

    Le CoreAnimation Programming Guide et le CoreAnimation Cook Book sont très bien.


    Après, pour mon exemple, je me souviens quand j'avais implémenté ça qu'en réalité je ne me rendais même pas compte que j'utilisais CoreAnimation. Pas besoin de sortir l'artillerie lourde : ça se fait en moins de 10 lignes (si, si)

    En effet, pour faire des animations avec CoreAnimation tu as deux possibilités :
    • Taper directement dans CoreAnimation : se plonger dans la doc de CA, utiliser les classes CAAnimation, CALayer & co. Tu utilises donc directement CoreAnim et son API, ce qui a l'avantage de te laisser plein de libertés (possibilités de configuration de l'animation, définition de la trajectoire, etc)
    • Utiliser les facilités qui sont fournies via les méthodes de classe de UIView. Ceci rend la chose beaucoup plus aisée : tu dis juste à  la classe UIView "tiens je veux que ce bloc de code se fasse de façon animée"... et c'est tout !


    La 2e solution est évidemment beaucoup plus simple à  utiliser, et en plus est tout à  fait suffisante dans ton cas. Au final ça ressemble à  quoi à  un truc comme ça :
    [UIView beginAnimations:@&quot;scrollingLabelAnimation&quot; context:NULL];<br />[UIView setAnimationDelegate:self];<br />[UIView setAnimationDidStopSelector:@selector(marqueeDidEnd:finished:context:)];<br />	<br />CGFloat dx = monLabel.frame.size.width - self.bounds.size.width; // &gt;0<br />monLabel.frame = CGRectOffset(monLabel.frame, -dx, 0);<br /><br />[UIView commitAnimations];
    
    Là  j'ai encadré le code qui change la frame d'un appel à  "beginAnimations:... context:..." sur la classe UIView, et d'un "commitAnimations" à  la fin, et ça suffit à  la base.

    Après, ici j'ai aussi rajouté un appel à  setAnimationDelegate et setAnimationDidStopSelector qui permet de dire quel message envoyer (didStopSelector) -- et à  quel objet l'envoyer (delegate) -- quand l'animation est terminée.
    Ce qui te permet d'être informé quand l'animation (celle qui va changer la frame de ton UILabel et donc le faire défiler) est arrivée au bout : à  ce moment tu peux par exemple relancer une autre animation (code du même genre) qui remet la frame d'origine (en 0,0) au label, pour qu'il reparte dans l'autre sens, etc...


    Tu vois, c'est pas sorcier, et pas besoin de sortir QuartzComposer, des NSTimers dans tous les sens... ni même de s'y connaà®tre en CoreAnimation pour faire ça :D


    Pour plus d'infos sur les méthodes de UIView qui permettent de gérer les animations (et t'éviter d'aller taper dans CoreAnimation toi-même), c'est cette partie de la doc de la classe UIView.
  • prepa75prepa75 Membre
    19:55 modifié #7
    Oki merci Ali je vais paufiner la doc Apple... :P

    je me demandé s'il existait un book comme celui de Hillegass porté sur CoreAnimation.

    je vais donc finir de bien maà®triser les bases et je m'y met après.
  • 19:55 modifié #8
    Mais on est sur Mac là ...
  • prepa75prepa75 Membre
    19:55 modifié #9
    dans 1269464156:

    Mais on est sur Mac là ...


    le prend pas mal Eaglelouk mais j'ai pas compris ton message  ???
  • ThibautThibaut Membre
    19:55 modifié #10
    ça parle de UIView, c'est dans la section développement Mac...
  • prepa75prepa75 Membre
    19:55 modifié #11
    dans 1269467794:

    ça parle de UIView, c'est dans la section développement Mac...


    ah ok  :P

  • AliGatorAliGator Membre, Modérateur
    19:55 modifié #12
    Ah oui, au temps pour moi, sur Mac tu es obligé de te palucher CoreAnimation ;)
    Bon c'est pas la mort non plus, suffit de créer un CABasicAnimation, avec le keyPath @frame (puisque c'est la propriété "frame" que tu veux animer), et d'ajouter cette CABasicAnimation au layer de la NSView.

    Il doit même y avoir tous les exemples qu'il faut dans le "CoreAnimation Cook Book" cité plus haut, voire sur les Sample Codes Apple.
    Mais c'est vrai que pour le coup, un bon coup de lecture de la doc de CoreAnimation t'aidera à  capter le tout.
  • 19:55 modifié #13
    La vache je devais avoir un gros moment de fatigue au moment où j'ai rédigé mon message précédent  B)
  • prepa75prepa75 Membre
    19:55 modifié #14
    dans 1269471494:

    Mais c'est vrai que pour le coup, un bon coup de lecture de la doc de CoreAnimation t'aidera à  capter le tout.


    oui je crois que je vais devoir m'y coller parsque la je suis particulierement perdu  :(

  • prepa75prepa75 Membre
    19:55 modifié #15
    dans 1269471908:

    La vache je devais avoir un gros moment de fatigue au moment où j'ai rédigé mon message précédent  B)


    pas grave ça arrive à  tout le monde 
Connectez-vous ou Inscrivez-vous pour répondre.