Ajuster la hauteur d'un UILabel à  un son contenu

Bonjour,


 


Je cherche désespérément à  ajuster la hauteur de mon label en fonction de son contenu


 


J'ai donc essayé ça, sans réussite:



_labelContenu.text = contenu_news;
NSString* messageContenu = contenu_news;
CGSize maxLabelSize = CGSizeMake(200, 1000);
CGSize expectedLabelSize = [messageContenu sizeWithFont:_labelContenu.font constrainedToSize:maxLabelSize lineBreakMode:NSLineBreakByWordWrapping];

CGRect newFrame = _labelContenu.frame;
newFrame.size.height = expectedLabelSize.height+10;
_labelContenu.frame=newFrame;

Aucune réussite non plus avec ça:



_labelContenu.text = contenu_news;
_labelContenu.lineBreakMode = NSLineBreakByWordWrapping;
_labelContenu.text=contenu_news;
_labelContenu.numberOfLines = 0;
[_labelContenu sizeToFit];

Qui pourrais m'aider en me donnant la solution svp ?


Réponses

  • Salut Jean75,


     


    j'ai déjà  été confronté à  ce problème. Voici comment je fais.


     


    1) je mets ma vue en autolayout. Tu dois mettre des contraintes pour ton UILabel mais de contrainte pour la hauteur. En gros, dans IB, il faut que la hauteur du UILabel colle avec la hauteur du texte qui y est mis (c'est lié à  intrinsicSize)


    2) je fais 



    label.numberOfLines = 0 ;
    label.lineBreakMode = NSLineBreakByWordWrapping ;

    Des fois ça marche juste comme ça. Des fois il faut ajouter :


    3) 



    [label setPreferredMaxLayoutWidth:kWidthLabel] ;

    cf.      http://stackoverflow.com/a/13032251/1670830


     

     

     

    J'espère que ces pistes t'aideront.

     

    Colas

  • Hello Colas,


     


    Déjà  merci pour ta réponse.


     


    J'ai essayé tout ce que tu m'a dit, excepté les contraintes, et il n'y a toujours aucune évolution.


     


    J'ai également regardé le lien vers SO ainsi que l'UILabel Documentation, sans résultats


  • AliGatorAliGator Membre, Modérateur

    J'ai essayé tout ce que tu m'a dit, excepté les contraintes

    Heu en même temps dans sa solution c'est justement les contraintes qui font toute la différence !
    En utilisant les contraintes (pour tout sauf la hauteur du label), le label va alors utiliser sa "intrisicContentSize" automatiquement pour caler sa hauteur. Donc c'est justement le fait d'utiliser les contraintes qui change tout.

    Et puis sinon y'a les méthodes sizeThatFits: et sizeToFit: (cf la doc) de toute façon si tu veux t'embêter à  tout faire à  la main...
  • Essaye avec les contraintes. 


     


    Conseil : essaye d'abord sur un projet-test juste dédié à  cette fonctionnalité, ça te permettra de comprendre quels sont les éléments nécessaires.




  • Et puis sinon y'a les méthodes sizeThatFits: et sizeToFit: (cf la doc) de toute façon si tu veux t'embêter à  tout faire à  la main...




     


    sizeToFit j'ai essayé sans résultats ;)


     


    Je vais essayer de regarder les contraintes ;)

  • Hello,


     


    J'utilise ce bout de code dans mes cellules :


     


        CGSize size = [tonLabel sizeThatFits:CGSizeMake(tonLabel.frame.size.width, INFINITY)];


        ....


        // Mise à  jour de la nouvelle taille du label.


        // Oublie pas de setter le numberOfLines à  0. 


     


     


    Mais le mieux c'est de suivre les conseils des autres sur les autolayouts. 


  • Bon j'ai commencé à  regarder les contraintes, et j'essaye de les mettre en place sur le projet


     


    @Samir: J'ai essayé ta solution en mettant le code ci-dessous, mais ça ne marche toujours pas :(



    CGSize size = [_labelContenu sizeThatFits:CGSizeMake(_labelContenu.frame.size.width, INFINITY)];
    CGRect frameContenu = _labelContenu.frame;
    frameContenu.size = size;

    _labelContenu.lineBreakMode = NSLineBreakByWordWrapping;
    _labelContenu.text=contenu_news;
    _labelContenu.numberOfLines = 0;
    _labelContenu.adjustsFontSizeToFitWidth = YES;
  • A priori, la solution de Samir n'est pas compatible avec AutoLayout. Il faut que tu regardes si ton xib est configuré pour utiliser les contraintes ou pas.


     


    Je te conseille de régler ce problème d'abord sur un "toy project" (un projet test), ça sera plus clair pour toi ensuite...


  • AliGatorAliGator Membre, Modérateur
    1) Utilise CGFLOAT_MAX " qui est la constante dédiée quand le type attendu est un CGFLOAT comme ici " plutôt que INFINITY


    2) Tu demandes à  ton code de calculer la taille ("sizeThatFits:") de ton label... AVANT d'y avoir mis le texte dedans ! Forcement ça va moins bien marcher ! "sizeThatFits:" va te calculer la taille idéale de ton label pour qu'il puisse afficher son label.text mais si au moment où tu l'appelles tu n'as pas encore mis le texte il va avoir du mal à  le deviner !!


  • A priori, la solution de Samir n'est pas compatible avec AutoLayout. Il faut que tu regardes si ton xib est configuré pour utiliser les contraintes ou pas.


     


    Je te conseille de régler ce problème d'abord sur un "toy project" (un projet test), ça sera plus clair pour toi ensuite...




     


    Oui le storyboard utilise les contraintes vu qu'elles sont utilisées dans les autres écrans.


     


    J'ai fait un toy project avec un label 2 boutons et une imageview, mais ça me parait pas beaucoup plus clair ^^



  • 1) Utilise CGFLOAT_MAX " qui est la constante dédiée quand le type attendu est un CGFLOAT comme ici " plutôt que INFINITY


    2) Tu demandes à  ton code de calculer la taille ("sizeThatFits:") de ton label... AVANT d'y avoir mis le texte dedans ! Forcement ça va moins bien marcher ! "sizeThatFits:" va te calculer la taille idéale de ton label pour qu'il puisse afficher son label.text mais si au moment où tu l'appelles tu n'as pas encore mis le texte il va avoir du mal à  le deviner !!




    Même après y avoir mis le texte ça ne marche pas ;)

  • @Jean75, envoie ton toy project, je peux y jeter un oe“il ;-)


  • Après ça ne marche pas ce n'est pas suffisant, il faut que tu décrives le contexte. Tu a mis ou ce code ? est-ce que tu es sur que ton label n'est pas nil ? .....

  • @Colas: Tu le trouveras en pièce jointe


     


    @Samir, oui le label n'est pas nul, et le code a été mis dans mon viewDidLoad


  • @Jean75 : il n'y a pas de code dans ton projet test !


  • Bah non, juste des élements placés avec des contraintes, afin de tester et d'appréhender ça ;)


  • colas_colas_ Membre
    décembre 2014 modifié #18

    Bin oui mais il faut que tu mettes le code qu'on te propose de tester !!! pour la longueur de UILabel se transforme automatiquement.


     


    Là  t'as même pas mis de texte long dans ton UILabel !!!


  • Bon finalement ça marche bien, mon texte s'affiche sur plusieurs lignes, mais la position des objets n'est pas celle désirée...


  • C'est normal : en gros tu as dit "Je veux que mon label soit à  82 au-dessus des boutons". Donc, quand ton label grandit et bien, il reste 82 au-dessus... et du coup, il remonte trop haut !!!


     


    Du coup ta nouvelle question est : comment marchent les contraintes ?


     


    Je t'invite à  faire quelques recherches et à  venir poser des questions ! (mais cherche avant).


    Les contraintes c'est un gros morceau, j'espère que tu trouveras de la bonne doc sur le web ;-)


  • Bah déjà  j'ai téléchargé les 2 vidéos de la WWDC 2012, faut que je les regarde ;)


  • bien joué ;-)


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