Souligner le texte dans UIlabel
Comment puis-je souligner un texte qui pourrait être de plusieurs lignes de chaîne?
Je trouve certaines personnes suggèrent UIWebView, mais il est évidemment trop lourds une classe juste pour le rendu du texte.
Mes pensées était de comprendre le point de départ et la longueur de chaque chaîne dans chaque ligne.
Et de tracer une ligne sous en conséquence.
Je rencontre des problèmes à la façon de déterminer la durée et point de départ de la chaîne.
J'ai essayé d'utiliser -[UILabel textRectForBounds:limitedToNumberOfLines:]
, cela devrait être le dessin de délimitation rect pour le texte à droite?
Puis-je travailler sur l'alignement?
Comment puis-je obtenir le point de départ de chaque ligne quand il est justifié à droite et justifiée?
- Regardez ce billet de blog
Vous devez vous connecter pour publier un commentaire.
Vous pouvez sous-classe de UILabel et de redéfinir la méthode drawRect:
UPD:
Comme d'iOS 6, Apple a ajouté NSAttributedString soutien pour UILabel, alors maintenant, il est beaucoup plus facile et travaille pour plusieurs lignes:
Si vous souhaitez soutenir iOS 4 et iOS 5, je vous recommande d'utiliser TTTAttributedLabel plutôt que de souligner l'étiquette manuellement. Toutefois, si vous avez besoin de souligner une ligne UILabel et ne voulez pas utiliser de composants tiers, code ci-dessus doit encore faire l'affaire.
C'est ce que j'ai fait. Il fonctionne comme le beurre.
1) Ajouter CoreText.cadre de vos Cadres.
2) import <CoreText/CoreText.h> dans la classe où vous avez besoin d'souligné l'étiquette.
3) Écrire le code suivant.
Dans Swift:
Utiliser un attribut de chaîne:
Puis remplacer l'étiquette - (void)drawTextInRect:(CGRect)aRect et de rendre le texte dans quelque chose comme:
Ou, mieux encore, au lieu de l'annulation de la juste utilisation de la OHAttributedLabel créé par Olivier Halligon
NSMutableAttributedString
J'ai combiner certaines des réponses, afin de créer de meilleures (au moins pour mes besoins) UILabel sous-classe, qui prend en charge:
https://github.com/GuntisTreulands/UnderLineLabel
Personnes, qui ne veulent pas sous-classe de la vue (UILabel/UIButton), etc...
'forgetButton" peut être remplacer par une étiquette trop.
Une autre solution pourrait être (depuis iOS 7) étant donné une valeur négative pour
NSBaselineOffsetAttributeName
, par exemple votreNSAttributedString
pourrait être:Espère que cela va aider 😉
Vous pouvez créer une étiquette personnalisée avec nom UnderlinedLabel et modifier drawRect fonction.
Ici est la solution la plus simple qui fonctionne pour moi sans l'écriture des codes supplémentaires.
Une version améliorée du code de Kovpas (couleur et taille de la ligne)
Que j'ai Créé pour multiligne uilabel à souligner :
Pour la taille de la Police de 8 à 13 réglez int lineHeight = auto.la police.pointSize+3;
Pour la taille de police 14 à 20 set int lineHeight = auto.la police.pointSize+4;
Comme kovpas a montré que vous pouvez utiliser la boîte englobante dans la plupart des cas, bien qu'il n'est pas toujours garanti que la boîte englobante sera parfaitement autour du texte. Une boîte avec une hauteur de 50 et une taille de police de 12 ne peut pas donner les résultats que vous voulez en fonction de la UILabel de configuration.
Requête de la UIString dans le UILabel pour déterminer son exacte de paramètres et de les utiliser pour mieux placer vos souligner indépendamment de l'affichage de la boîte englobante ou de l'image à l'aide du code de dessin déjà fournis par kovpas.
Vous devriez aussi regarder UIFont de "chef de file" de la propriété qui donne la distance entre les lignes de base fondée sur une police particulière. La base de référence est l'endroit où vous voulez votre soulignent à tirer.
Chercher le UIKit ajouts à NSString:
- Je utiliser de l'open source de ligne de vue et juste ajouté ça à le bouton des sous-vues:
Cela a été inspirée par Karim ci-dessus.
Basé sur Kovpas & Damien Praca Réponses, voici une implémentation de UILabelUnderligned qui a également en charge textAlignemnt.
et la mise en œuvre:
Voici une autre solution, plus simple (souligner la largeur n'est pas le plus précis, mais il était assez bon pour moi)
J'ai une UIView
(_view_underline)
qui a un fond Blanc, hauteur de 1 pixel et je l'ai mise à jour de sa largeur à chaque fois que je l'ai mise à jour le texteNSUnderlineStyleAttributeName qui prend un NSNumber (où 0 est le pas de souligner) peut être ajouté à un attribut dictionnaire.
Je ne sais pas si c'est plus facile. Mais, c'était plus facile pour mes fins.
Swift 4.1 ver: