Espace entre un label et son texte

2»

Réponses

  • Non il ne s'adapte pas tout seul si je ne fais pas ça, il s'affiche uniquement sur une ligne :(


     


    Et pour ceux qui pourraient s'étonner de voir cette méthode au lieu du sizeToFit c'est juste que j'ai besoin de récupérer les tailles et les emplacements de chaque UILabel, pour afficher l'autre en dessous


  • Désolé mais il te faut relire le manuel sur les Labels. 


     


    Les Labels ont une propriété lines qui permet de définir le nombre de lignes.


     


    Définir soit même les tailles des objets standard est rarement une bonne idée. Cela sert souvent aux dev à  contourner un problème qu'il ne maitrise pas. Je t'invite aussi à  consulter la doc sur les Auto-Layouts qui permette d'ajuster automatiquement les view par rapport au device et à  l'orientation.


     


    Courage...


  • Je connais bel et bien la propriété "lines" de l'UILabel seulement je ne sais pas d'avance si mon label va faire 1 ligne, ou bien 8 ou bien 40, donc quelle valeur je suis censé mettre ? 9999 ?


     


    Et puis c'est ça peut être qui va augmenter automatiquement la hauteur de mon label (bah oui je vais pas faire un label de 500 px de hateur de hauteur si je n'ai qu'une ligne dedans) ? J'en doute très fortement ;)


  • Tu peux savoir combien de "place" va faire ton label si tu connnais les dimensions maximales de ce label.


    Grâce à  cette petite fonction tu peux définir la taille du label :



    /*************** Fonction qui calcul la taille d'un label en fonction du texte *************/

    -(CGRect)rectForText:(NSString *)text
    usingFont:(UIFont *)font
    boundedBySize:(CGSize)maxSize
    {
    NSAttributedString *attrString =
    [[NSAttributedString alloc] initWithString:text
    attributes:@{ NSFontAttributeName:font}];

    return [attrString boundingRectWithSize:maxSize
    options:NSStringDrawingUsesLineFragmentOrigin
    context:nil];
    }

    Après oui tu peux mettre un grand nombre de ligne pour prévoir. Grâce à  cette fonction tu peux savoir que va faire ton label avec le NSString que tu lui passe en paramètre.

  • Qu'est ce que la propriété boundedBySize s'il te plait ? Merci d'avance :)


  • C'est la taille maximale que tu accepte d'allouer pour le label. C'est à  dire que la fonction te retournera une valeur comprise entre 0 et la taille maximale que tu voudra mettre



    CGSize maximumLabelSize = CGSizeMake(280,1500);
  • Ce code je l'utilise déjà  actuellement dans mon fichier (cf plus haut)


  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2014 modifié #39

    Pardon, mais je recommence à  zero.


     


    Ben, qu'est-ce que tu veux accomplir ? Je devine que c'est quelque chose comme Messages.


     


    Si oui, as-tu considéré d'utiliser un UITableView ?


     


    Tu pourrais ajouter un label en autolayout dans une cellule et avec le minimum de code, determiner la taille de la cellule dont l'espace autour le label automatiquement !


     


    ça serait beaucoup plus facile que de continuer à  bidouiller avec tous ces trucs compliqués.


     


    Je pourrais faire ce que tu essaies de faire en moins d'une heure.


  • Tout à  fait je veut faire quelque chose comme Messages, mais avec des messages qui sont enregistrés et récupérés depuis une BDD.


     


    A vrai dire non j'ai pas encore réfléchi à  une TableView, des labels me paraissaient le plus logique, mais je peut me tromper.


  • Joanna CarterJoanna Carter Membre, Modérateur

    "Use the Force Luke"  ::)


     


    Le TableView serait très facile


  • Pardon, pour mon indication , j'avais pas vu que l'on t'avais proposé la solution déjà  ( et j'avais lu pourtant.. )


     


    De ce que j'ai lu, et j'espère ne pas me tromper, le mieux est d'utiliser les UIEdgeInsets. Ca semble être ce qui correspond le mieux à  ton problème.


  • Et comment ça se passerait avec une tableView ? Un message par cellule ? Comment alterner pour afficher soit le fond en bleu soit en vert ?


     


    Ok je vais regarder un peu comment marche les UIEdgeInsets, merci :)


  • Joanna CarterJoanna Carter Membre, Modérateur

    Les UIEdgeInsets ne s'appliquent pas aux labels, sauf si on le sous-classe 


  • LarmeLarme Membre
    août 2014 modifié #45

    Je connais bel et bien la propriété "lines" de l'UILabel seulement je ne sais pas d'avance si mon label va faire 1 ligne, ou bien 8 ou bien 40, donc quelle valeur je suis censé mettre ? 9999 ?
     
    Et puis c'est ça peut être qui va augmenter automatiquement la hauteur de mon label (bah oui je vais pas faire un label de 500 px de hateur de hauteur si je n'ai qu'une ligne dedans) ? J'en doute très fortement ;)

    Alors, clairement, là , je t'invite à  lire la doc :

    numberOfLines
    The maximum number of lines to use for rendering text.

    @property(nonatomic) NSInteger numberOfLines
    Discussion
    This property controls the maximum number of lines to use in order to fit the label's text into its bounding rectangle. The default value for this property is 1. To remove any maximum limit, and use as many lines as needed, set the value of this property to 0.

    If you constrain your text using this property, any text that does not fit within the maximum number of lines and inside the bounding rectangle of the label is truncated using the appropriate line break mode.

    When the receiver is resized using the sizeToFit method, resizing takes into account the value stored in this property. For example, if this property is set to 3, the sizeToFit method resizes the receiver so that it is big enough to display three lines of text.

    Availability
    Available in iOS 2.0 and later.


     Par rapport au bout de code que j'avais posté, il faut également setter le firstHeadIndent aussi je crois, et peut-être tester avec des valeurs plus grandes que 5.

    Tout à  fait je veut faire quelque chose comme Messages, mais avec des messages qui sont enregistrés et récupérés depuis une BDD.
     
    A vrai dire non j'ai pas encore réfléchi à  une TableView, des labels me paraissaient le plus logique, mais je peut me tromper.


    Et une UITableView me semble la meilleure solution personnellement.
    Pas de merdes de scrolling, c'est géré, possibilité d'utiliser des Custom UITableViewCell, avec en prenant par exemple un argument afin de savoir si on doit être à  gauche ou à  droite, voire de gérer son background en fonction...
  • Actuellement tel que c'est actuellement ma propriété "lines" est déjà  à  0, cependant comme dis plus haut, le nombre de lignes ne modifiera pas la hauteur de mon label, hors c'est ça qui compte en plus du nombre de lignes ;)


     


    Ok je vais me pencher et regarder comme faire cela grâce à  une tableView


  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2014 modifié #47


    Et comment ça se passerait avec une tableView ? Un message par cellule ? Comment alterner pour afficher soit le fond en bleu soit en vert ?




     


    Oui, un message par cellule. Pour alterner le côté sur lequel le message s'affiche et sa couleur, tu peux créer deux prototypes de cellule et tu peux les charger selon l'auteur du message.


  • Ok merci pour ces conseils précieux :)


  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2014 modifié #49

    Ben, tu trouveras un petit projet ci-joint, dans lequel je démontre les techniques autolayout et sous-classement pour réaliser un TableView, qui contient les cellules qui règlent leurs tailles, même une cellule qui contient un TableView qui contient les cellules qui règlent leurs tailles.


     


    D'abord, tu ne verras qu'une cellule avec deux Labels mais, si tu faisais un long-press sur la cellule, elle se développera et tu pourras voir que la cellule est devenu assez complexe. 


  • Ok merci :)



  •  


    ld: warning: directory not found for option '-F/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries'


    ld: framework not found Reveal


    clang: error: linker command failed with exit code 1 (use -v to see invocation)


  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2014 modifié #52

    Pardon, il faut aller à  Build Phases | Link Binary With Libraries et enlever Reveal


     


    Oh, et n'oublies pas de faire la rotation 


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