Espace entre un label et son texte

Bonjour,


 


Je ne sais pas si c'est possible ou non, mais après avoir cherché durant plusieurs heures je m'adresse à  vous.


 


Bon voila j'ai un label (avec un fond bleu ou vert dans le cas du screenshot), et j'ai un texte dans ce label.


 


J'aimerais que ce texte ne soit pas autant collé au X de l'UILabel, qu'il y ai un espace entre le début de mon label et mon texte (genre X du label = 200, X du texte = 205), et cela quelque soit la ligne (car oui ces labels peuvent avoir plusieurs lignes, selon leurs contenus).


 


 


Bien évidemment je ne veut pas mettre cet espace manuellement (et surtout cela ne marche pas dans le cas ou j'ai plusieurs lignes).


 


Mettre un autre label avec un fond transparent par dessus celui existant ne me plait guère plus comme solution.


 


Merci d'avance


«1

Réponses

  • CéroceCéroce Membre, Modérateur
    Je ne crois pas qu'on puisse faire ça, même avec l'autolayout.

    Une autre solution est d'utiliser une NSView derrière (pas parente!) et autolayout. Tu ajouterais 4 contraintes pour que la NSView déborde en haut, à  gauche, en bas et à  droite.

    Sinon, il reste toujours la solution de mettre le label en enfant d'une NSView, mais dans ce cas, il faut calculer la taille de la vue parente en fonction de la taille du texte.
  • Ben77650Ben77650 Membre
    août 2014 modifié #3

    Je ne souhaite pas utilise l'autolayout, vu que je doit gérer différentes tailles.


     


    Sinon oui le label est à  l'intérieur d'une UIScrollView


  • CéroceCéroce Membre, Modérateur
    Bon. Essaie de comprendre ce que j'ai écris. à‰tudie ce qu'est vraiment l'autolayout. Et peut-être qu'alors nous pourrons avoir une discussion constructive.
  • LarmeLarme Membre
    août 2014 modifié #5

    J'ai pas réellement compris ce que tu voulais...


    Mais tu es dans la section OS X, tu parles de UILabel et de UIScrollView, et Céroce de NSView...


    La problématique globale semble être la même, mais quand même. Vu que certains trucs existent sur une plateforme mais pas l'autre...


     


    Sinon, peut UIEdgeInset, ou un truc du genre, ou alors un NSParagraphStyle et son indent.


  • Oups désolé je me suis trompé de section, si un modérateur pouvais le déplacer :/


     


    En fait c'est peut être plus clair avec le screen, le texte démarre collé à  la bordure gauche du label, et en fait j'aimerais qu'il y ai un espacement entre cette bordure gauche et mon texte :)


  • Je ferais ainsi (codé de tête, pas sûr que ça compile), car je joue beaucoup avec les NSAttributedString en ce moment :



    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    [style setHeadIndent:5.0];
    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:@{NSParagraphAttributeName:style}];
    [yourLabel setAttributedText:attributedString];
  • Joanna CarterJoanna Carter Membre, Modérateur


    Je ne souhaite pas utilise l'autolayout, vu que je doit gérer différentes tailles.




    Différents tailles de quoi ? Avec autolayout la disposition des views s'adaptent selon leurs tailles

  • Ben77650Ben77650 Membre
    août 2014 modifié #9

    Différentes tailles de devices, mon application doit tourner aussi bien sur de l'iPhone 3GS/4/4S (3,5 inches) que sur du 5/5C/5S (4 inches) et dans le futur également sur toutes les tablettes Apple ;)


  • Joanna CarterJoanna Carter Membre, Modérateur

    L'autolayout est fait expressément pour ça


  • DrakenDraken Membre
    août 2014 modifié #11
    Tu ferais mieux de te préoccuper de l'iPhone 6 que d'une compatibilité avec le modèle 3G, obsolète depuis iOS 6.


  • L'autolayout est fait expressément pour ça




     


    Encore un truc erroné donné par mon professeur.


     




    Tu ferais mieux de te préoccuper de l'iPhone 6 que d'une compatibilité avec du modèle 3G, obsolète depuis iOS 6.




     


    Quelle taille d'écran l'iPhone 6, désolé l'info m'a échappée.

  • Joanna CarterJoanna Carter Membre, Modérateur


    Encore un truc erroné donné par mon professeur.




     


    Qu'est-ce qu'il à  dit sur l'autolayout ?


     




    Quelle taille d'écran l'iPhone 6, désolé l'info m'a échappée.




     


    Ce n'est pas important. ça c'est le but d'autolayout - de n'avoir pas de soucis sur la taille de l'écran

  • Ben77650Ben77650 Membre
    août 2014 modifié #14

    Ce n'est pas important. ça c'est le but d'autolayout - de n'avoir pas de soucis sur la taille de l'écran



     

    Sauf que ça me pose problème, avant j'avais l'autolayout et ça ne me mettais pas les éléments comme je le souhaitais.

     



    Qu'est-ce qu'il à  dit sur l'autolayout ?



     

    Je retrouve plus les mots exact, mais grosso modo il avait dit qu'il fallait le décocher quand on voulais gérer des tailles différentes de devices


  • Joanna CarterJoanna Carter Membre, Modérateur


    Sauf que ça me pose problème, avant j'avais l'autolayout et ça ne me mettais pas les éléments comme je le souhaitais.




     


    Dans quelle version de Xcode ? Il y avait des gros ennuis avec autolayout avant Xcode 5


     




    Je retrouve plus les mots exact, mais grosso modo il avait dit qu'il fallait le décocher quand on voulais gérer des tailles différentes de devices




     


    Avant Xcode 5, il avait raison.

  • Et si tout simplement tu ajoutes avant l'affichage, 1 ou plusieurs caractères espace devant le texte de ton label.

  • Des espaces insécables ? (c'est possible ?)


  • Joanna CarterJoanna Carter Membre, Modérateur

    Mauvaise idée  B)


  • août 2014 modifié #19

    Terrible ton smiley  :D


     


    Pourquoi ? Enfin après c'est vrai que c'est un peu du bricolage à  l'arrache. J'imagine que ça pète en fonction des tailles écran...


  • Hello,


     


    J'opterai pour la solution de Céroce.


     


    Sinon tu peux sous-classe ton UILabel et redéfinir drawTextInRect:. 


  • Ha, oui, mince, il peut y avoir plusieurs lignes...

  • Personnellement j'irai vers une classe perso héritant de UILabel dans laquelle


       1) j'ajoute des propriété de marges 


       2) j'ajoute un UIView à  l'initialisation que je positionne en fonction des marges avec un background égal à  celui du UILabel


       3) je n'oublie pas de supprimer mon UIView dans le dealloc.


     


    ça devrait avoir l'avantage d'être réutilisable sans problèmes partout.



  • Encore un truc erroné donné par mon professeur.



    Quelle taille d'écran l'iPhone 6, désolé l'info m'a échappée.




    On le saura en détail le 9 septembre, dans deux semaines. C'est demain, donc il faut y penser maintenant !


  • Dans quelle version de Xcode ? Il y avait des gros ennuis avec autolayout avant Xcode 5




     


    Xcode 5.1.1


     




    Et si tout simplement tu ajoutes avant l'affichage, 1 ou plusieurs caractères espace devant le texte de ton label.




     




    Des espaces insécables ? (c'est possible ?)




     


    Ca marche bien quand j'ai qu'une seule ligne, mais dans le cas ou j'ai plusieurs lignes ça marche tout de suite moins bien...


     




    Hello,


     


    Sinon tu peux sous-classe ton UILabel et redéfinir drawTextInRect:. 




     


    Peut tu m'en dire plus s'il te plait ?

  • Joanna CarterJoanna Carter Membre, Modérateur

    Si tu utilises Xcode 5, tu peux profiter de autolayout sans aucun souci. Il ne te resterait qu'à  apprendre comment mieux placer les contraintes


     


    Si je voulait sous-classer UILabel, je redéfinirais textRectForBounds:limitedToNumberOfLines: au lieu de drawTextInRect:


  • Une manière simple est d'utiliser 


     




     


    Je ferais ainsi (codé de tête, pas sûr que ça compile), car je joue beaucoup avec les NSAttributedString en ce moment :



    NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
    [style setHeadIndent:5.0];
    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:@{NSParagraphAttributeName:style}];
    [yourLabel setAttributedText:attributedString];



    La proposition de Larme semble la meilleure.


     


    Si tu ne veux pas t'embêter avec le mode programmatique tu peux aussi spécifier tout cela dans le storyboard.


     


    Il faut pour ton label choisir pour l'attribut text : "attibuted string"


  • Ben77650Ben77650 Membre
    août 2014 modifié #27

    Hello iLandes,


     


    Tout d'abord merci d'avoir répondu, réponse fortement intéressante. Mais si je me fie à  ton screen j'ai bien l'impression que ça n'indente que la 1ère ligne, hors idéalement j'aimerais indenter toutes les lignes :)


     


    PS: Après l'avoir testé et ce malgré les réglages fait comme au dessus, j'ai pas de décalage sur la 1ère ligne


  • Pour info je fais comme ça dans mon code pour adapter la hauteur au contenu (peut être que le souci viens de la)



     _bleu1.text=_messageField.text;
        NSString* messageBlue1 = _messageField.text;
        CGSize maxLabelSize = CGSizeMake(200, 10000);
        
        CGSize expectedLabelSize = [messageBlue1 sizeWithFont:_bleu1.font constrainedToSize:maxLabelSize lineBreakMode:NSLineBreakByWordWrapping];
        
        CGRect newFrame = _bleu1.frame;
        newFrame.size.height = expectedLabelSize.height+10;
        
        _bleu1.frame=newFrame;
        
        CGRect textFrame = _subtextB1.frame;
        textFrame.origin.y = expectedLabelSize.height+25;
        _subtextB1.frame=textFrame;

    J'ai d'ailleurs un warning (que j'aimerais corriger, question de propreté, ne pas laisser de warning dans mon code)


    'sizeWithFont:constrainedToSize:lineBreakMode:' is deprecated: first deprecated in iOS 7.0 - Use -boundingRectWithSize:options:attributes:context:

     


  • Faut quand même chercher un peu.


     


    Pour toutes les lignes il faut faire


  • Merci pour ta réponse si rapide, comme dit précédemment ça ne marche pas, est ce que c'est la faute à  mon code pour adapter la hauteur du label à  son contenu ?




  • Pour info je fais comme ça dans mon code pour adapter la hauteur au contenu (peut être que le souci viens de la)



     _bleu1.text=_messageField.text;
        NSString* messageBlue1 = _messageField.text;
        CGSize maxLabelSize = CGSizeMake(200, 10000);
        
        CGSize expectedLabelSize = [messageBlue1 sizeWithFont:_bleu1.font constrainedToSize:maxLabelSize lineBreakMode:NSLineBreakByWordWrapping];
        
        CGRect newFrame = _bleu1.frame;
        newFrame.size.height = expectedLabelSize.height+10;
        
        _bleu1.frame=newFrame;
        
        CGRect textFrame = _subtextB1.frame;
        textFrame.origin.y = expectedLabelSize.height+25;
        _subtextB1.frame=textFrame;

    J'ai d'ailleurs un warning (que j'aimerais corriger, question de propreté, ne pas laisser de warning dans mon code)




    J'aime pas du tout ton code. >:D


     


    Pourquoi tu veux adapter la hauteur de ton label ? Il s'adapte pas tout seul en fonction du contenu ?

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