Multiples couleurs sur un UILabel incluant plusieurs NSString

2»

Réponses

  • dernière petite question sur le sujet :


    est-ce que j'ai possibilité de limiter le nombre de caractères sur un des NSAttributedString ?


    En effet concernant celui ci-dessous (commentaire) je souhaiterais qu'il ne fasse qu'une longueur de 50 caractères maxi. Au-delà  des 50 j'aimerais qu'il se termine par "..."


    (je suis conscient que ça devient très compliqué...)



    NSAttributedString *commentAttr = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@%@", commentActivity] attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:13.0f],NSForegroundColorAttributeName:[UIColor darkGrayColor]}];
    [attrStr replaceCharactersInRange:[attrStr.string rangeOfString:@<PlaceHolder3>] withAttributedString:commentAttr];
  • CéroceCéroce Membre, Modérateur

    est-ce que j'ai possibilité de limiter le nombre de caractères sur un des NSAttributedString ?
    En effet concernant celui ci-dessous (commentaire) je souhaiterais qu'il ne fasse qu'une longueur de 50 caractères maxi. Au-delà  des 50 j'aimerais qu'il se termine par "..."

    Habituellement, on ne le fait pas. UILabel affiche lui-même l'ellipse (...) si le texte est trop long. C'est assez logique, parce que ce qui compte n'est pas la longueur de la chaà®ne, mais la place dont on dispose à  l'écran, qui peut d'ailleurs varier.
  • JérémyJérémy Membre
    février 2017 modifié #34

    +1 avec Ceroce.


     


    Si jamais tu veux tout de même avoir 50 caractères tu peux faire un truc du genre (swift) :



    let myString = "Hello Cocoacafé"
    let mySubString = String(myString.characters.prefix(7))
    print (mySubString) //"Hello C" dans la console

  • DrakenDraken Membre
    février 2017 modifié #35

    Je ne sais pas si on peut faire la même chose en Obj-C, Jérémy.


    Jopaone peut utiliser la fonction substring() pour extraire une partie d'un NSString.


    a



    let limite = 10
    let str1:NSString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    var str2 = NSString()

    if str1.length > limite {
    str2 = str1.substring(to: limite) as NSString
    } else {
    str2 = str1
    }
    print ("Chaine initiale : ", str1)
    print ("Chaine tronquée : ", str2)


    a



     


    Chaine initiale :  ABCDEFGHIJKLMNOPQRSTUVWXYZ


    Chaine tronquée :  ABCDEFGHIJ


  • Je comprends tout à  fait la logique de Céroce, mais dans mon cas j'ai ajouté un 4ème NSAttributedString, voyez ci-dessous la construction de mon label, je veux seulement limiter le nombre de caractères du 3ème "placeholder":



    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:@<PlaceHolder1> <PlaceHolder2> : <PlaceHolder3>. <PlaceHolder4>];
  • LarmeLarme Membre
    février 2017 modifié #37

    C'est étrange comme choix que de vouloir faire une ellipse en plein milieu d'un string.


    Peut-être que ton design n'est pas bon.


     


    C'est tout à  fait possible, mais tu préfères compter le nombre de caractères plutôt que l'espace final ? À moins d'utiliser des polices monospace, c'est perturbant.




  •  


    Je comprends tout à  fait la logique de Céroce, mais dans mon cas j'ai ajouté un 4ème NSAttributedString, voyez ci-dessous la construction de mon label, je veux seulement limiter le nombre de caractères du 3ème "placeholder":



    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:@<PlaceHolder1> <PlaceHolder2> : <PlaceHolder3>. <PlaceHolder4>];



    Il est plus astucieux de tester l'espace d'affichage de la chaà®ne. Regarde ce post : http://forum.cocoacafe.fr/topic/14073-swiftresoluaffichage-dune-nsattributedstring-avec-une-contrainte-de-largeur/?hl=nsattributedstring



  • C'est étrange comme choix que de vouloir faire une ellipse en plein milieu d'un string.


    Peut-être que ton design n'est pas bon.


     


    C'est tout à  fait possible, mais tu préfères compter le nombre de caractères plutôt que l'espace final ? À moins d'utiliser des polices monospace, c'est perturbant.




    certes mon choix de design est alambiqué et je pourrais le concevoir autrement mais néanmoins il très esthétique,


    concrètement


    - le placeholder3 correspond au commentaire d'un utilisateur (potentiellement très long c'est pourquoi je veux le limiter)


    - le placeholder4 indique une information temporelle (issue de _timeIntervalFormatter)


     


    Si l'utilisateur appuie sur la cellule concernée il pourra voir le commentaire en entier sur un second controller

  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #40

    Je crois que tu confonds l'idée de présentation avec les données que tu veuilles présenter.


     


    Avec le Unicode pour les strings, c'est plus difficile de trouver les substrings en Swift qu'en Objective-C.


     


    UILabel s'occupe déjà  des ellipses et du coup, je reviens avec ma suggestion de mettre trois UILabels dan un UIStackView.


     


  • J'utiliserais un autre label pour ça. Ainsi, il est coupé automatiquement notamment via sa largeur rendue (en terme d'UI) et non pas via sa longueur en nombre de caractères, car comme je l'ai dit précédemment, si tu as "HELLO" et "iiiii" ont le même nombre de caractères mais en prendront certainement pas la même place.


  • Joanna CarterJoanna Carter Membre, Modérateur


    J'utiliserais un autre label pour ça. Ainsi, il est coupé automatiquement notamment via sa largeur rendue (en terme d'UI) et non pas via sa longueur en nombre de caractères, car comme je l'ai dit précédemment, si tu as "HELLO" et "iiiii" ont le même nombre de caractères mais en prendront certainement pas la même place.




     


    Et, c'est pour les raisons comme ça que j'ai proposé d'utiliser autolayout, soit avec ou sans UIStackView

  • Très juste , vous m'avez convaincu je vais changer mon fusil d'épaule, certainement un stack view comme conseillé par Joanna ça me semble la solution la plus adaptée à  ce que je souhaite faire , encore merci à  tous !


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #44

    Petit conseil : mettre le Horizontal Content Compression Resistance de la première label à  751 pour qu'elle ne se raccourcisse pas


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