[Core Text] Problème de Line breaking mode ?

JegnuXJegnuX Membre
avril 2013 modifié dans Objective-C, Swift, C, C++ #1

Hello


 


Pour un éventuel futur projet j'explore quelque piste sur la création de label avec le texte qui "suit" une forme, par exemple un losange.


 


Pour ça j'utilise Core Text et les NSAttributedString (d'ailleurs merci à  Ali pour sa catégorie de NSAttributedString et son OHParagraphStyle ^^ )


 


J'applique un kCTLineBreakByWordWrapping à  mon attributed string mais ça me suffit pas. La doc dit clairement que ça évitera de couper au milieu d'un mot sauf si le mot lui même est trop long par rapport à  la largeur disponible.


 


Du coup sur le haut de mon losange, les mots de plus de n lettres sont systématiquement coupés.


 


Comment faire pour dans ce cas, faire en sorte de commencer à  écrire "plus bas" ?


Si y'a rien d'automatique comment vous feriez ça ?


 


Voici une capture de ce que j'ai : 

Réponses

  • Le "Vertical ALignement" que tu cherches, c'est le UIBaselineAdjustment ?


    Note, que je connais pas cette partie de CoreTexte, mais j'ai déjà  vu des trucs de ce genre-là , jamais utilisé mais cela peut être intéressant à  regardé.


  • Si tu rajoutes des lignes vides au début de ton texte, ça devrait le faire descendre.


     


    Mais bon pour avoir le bon alignement que tu désires, il faudrait mieux que tu dessine toi même les textes dans la méthode


     


    "DrawRect"


  • Si tu rajoutes des lignes vides au début de ton texte, ça devrait le faire descendre.


     


    Mais bon pour avoir le bon alignement que tu désires, il faudrait mieux que tu dessine toi même les textes dans la méthode


     


    "DrawRect"


     


     


    Oui justement pour la capture j'ai rajouté un "\n" au début de mon texte. Mais comme les textes seront issue d'un flux et les formes relativement dynamique (losange, triangles, de tailles différentes) je ne peux pas m'amuser à  rajouter des "\n". C'est pas très propre.


     


    Sinon je dessine bel et bien moi même mon texte dans le drawRect: mais en m'appuyant sur les API de Core Text.

  • AliGatorAliGator Membre, Modérateur

    Je me souviens avoir galéré sur OHAttributedLabel avec les Word Wrapping, y'a même une issue sur mon GitHub qui est encore ouverte...


  • Pas top top tout ça, j'ai bien peur de devoir dire aux graphistes d'être un peu moins originaux :-/


  • Ou pas finalement.


     


    Le seul moyen que j'ai trouvé c'est de faire un seconde bezier path qui "coupe" les pointes du haut et du bas. Du coup Core Text ne s'en va pas dessiner dedans et on se trouvera moins probablement dans ce cas (juste pour les mots très long du coup...).


     


    C'est pas parfait mais ça devrait suffire.


  • AliGatorAliGator Membre, Modérateur

    En même temps en fait je pense que le comportement observé est normal.


     


    C'est comme dans Word ou tout autre traitement de texte si tu écris un pseudo-mot de 3km sans espace, ce qui fait qu'il ne peut pas tenir sur une ligne en entier.


     


    Imagine, tu crées un document Word, tu augmentes les marges gauche et droite un max pour n'avoir plus que 3cm de largeur pour écrire. Si tu écris "Bonjour CocoaCafé" tu vas avoir la place de faire tenir "Bonjour" sur la première ligne et il va passer à  la ligne suivante pour "CocoaCafé" car ça ne tiendrait plus sinon. Donc il peut passer le mot à  la ligne, ça va. Mais si tu écris "supercalifragilisticexpialidocious"...), bah par contre du coup il ne peut pas faire tenir ce mot sur une ligne, même tout seul ! Donc comme il n'a pas le choix il va quand même écrire le début du mot et le tronquer pour écrire la fin à  la ligne. Comme il fait sur le "Lorem" de ton "Lorem Ipsum" avec CoreText.


     


     


    Alors tu vas me dire "oui mais avec ton exemple sous Word la zone est rectangulaire, là  avec mon exemple en CoreText il aurait la place d'écrire le mot entier sur la ligne d'en dessous car mon losange s'élargit" ouais mais bon t'imagines l'algo de fou pour qu'il réalise ça ? Et puis surtout imagine qu'au lieu d'un losage, tu aies un BezierPath en forme de "+", très étroit au début pendant 20 lignes de texte puis très large seulement sur la 21ème ligne... si on applique la même logique ça veut dire que si tu écris "Le mot supercalifragilisticexpialidocious est très long" ça va écrire "Le mot" sur la première ligne, puis "supercalifragilisticexpialidocious" sur la 21ème ligne car c'est la première ligne assez large pour faire tenir le mot ? Non, il va écrire "supercalifragilisticexpialidocious" sur les lignes suivantes, en coupant le mot sur plusieurs lignes car la zone est encore trop étroite à  ce moment là , tout pareil.


     


    Donc en fait quand tu y penses, tout cela est normal, et c'est pas vraiment un "problème de CoreText" mais plutôt logique, finalement !


  • Oui je suis entièrement d'accord avec toi, c'est logique.


     


    Mais bon au final en codant le système qui permet de centrer verticalement, ça résoud mon "problème" ce sera ensuite au client de ne rien mettre de trop long, comme il le ferait pour une autre application.


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