303 votes

Comment contrôler l'interligne dans UILabel ?

Est-il possible de réduire l'écart entre les textes, lorsqu'ils sont placés sur plusieurs lignes dans un fichier de type UILabel ? Nous pouvons définir le cadre, la taille de la police et le nombre de lignes. Je veux réduire l'écart entre les deux lignes de cette étiquette.

1 votes

2 votes

Puis-je vous suggérer d'accepter une des réponses qui est correcte pour iOS 6.0 et plus ? La réponse actuellement acceptée est obsolète.

0 votes

Pour chaque ligne, utilisez un nouveau UILabel puis intégrer toutes les étiquettes dans une StackView . Enfin, ajustez le spacing de StackView . N'oubliez pas de les empiler verticalement.

418voto

Mike Slutsky Points 688

Dans Xcode 6, vous pouvez le faire dans le storyboard :

enter image description here

1 votes

Profitez des avantages de storyboard !

0 votes

C'est exactement ce dont j'avais besoin (j'avais besoin de compresser les lignes). Merci beaucoup !

1 votes

L'utilisation de cette option semble casser mon ib à chaque fois, quelqu'un sait-il quel est le problème ?

283voto

Mazyod Points 6072

J'ai pensé à ajouter quelque chose de nouveau à cette réponse, pour ne pas me sentir aussi mal... Voici un Swift réponse :

import Cocoa

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 40

let attrString = NSMutableAttributedString(string: "Swift Answer")
attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))

var tableViewCell = NSTableCellView()
tableViewCell.textField.attributedStringValue = attrString

"Réponse courte : vous ne pouvez pas. Pour modifier l'espacement entre les lignes de texte, vous devrez sous-classer UILabel et lancer votre propre drawTextInRect, ou créer plusieurs étiquettes."

~~

Voir : Définir l'espacement des lignes de UILabel


~~

C'est une très vieille réponse, et d'autres ont déjà ajouté la nouvelle et meilleure façon de gérer cela Veuillez consulter les réponses à jour fournies ci-dessous.

25 votes

Depuis iOS 6.0, vous pouvez le contrôler via NSAttributedString (également disponible dans les propriétés de UILable dans le constructeur d'interface de Xcode).

13 votes

Il est intéressant de noter que, pour autant que je sache, vous pouvez ajouter un espacement supplémentaire entre les lignes, mais pas le réduire via la fonction NSParagraphStyle lors de l'utilisation d'un NSAttributedString . (Il se peut que je doive faire plus de tests sur les autres propriétés modifiables, mais les lineSpacing ne vous permet que de l'augmenter).

0 votes

Voir ma réponse pour voir une façon d'utiliser NSAttributedString

109voto

Shady Points 1254

À partir d'iOS 6, vous pouvez définir une chaîne attribuée à l'UILabel. Vérifiez ce qui suit :

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)];

label.attributedText = attributedString;

1 votes

El attributedString doit être un NSMutableAttributedString (PAS NSAttributedString)

14 votes

La première ligne de code devrait être NSMutableAttributedString *attributedString = [NSMutableAttributedString alloc]initWithString:@"sample text"];

1 votes

El lineSpacing de l NSMutableParagraphStyle n'est jamais négative, la hauteur de la ligne ne peut donc pas être réduite avec cette approche. Pour répondre à la question, vous devez utiliser une autre propriété, voir la réponse de @d.ennis.

83voto

d.ennis Points 1625

Les solutions proposées ici n'ont pas fonctionné pour moi. J'ai trouvé un moyen légèrement différent de le faire avec la NSAttributeString d'iOS 6 :

myLabel.numberOfLines = 0; 
NSString* string = @"String with line one. \n Line two. \n Line three.";
NSMutableParagraphStyle *style  = [[NSMutableParagraphStyle alloc] init];
style.minimumLineHeight = 30.f;
style.maximumLineHeight = 30.f;
NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:string
                                                         attributes:attributtes];   
[myLabel sizeToFit];

2 votes

La hauteur des lignes dépend de la taille de la police. L'interligne n'est que cela, l'interligne. Vous pouvez obtenir des résultats en définissant simplement une hauteur de ligne minimale/maximale, mais c'est uniquement parce que les tailles de police actuelles que vous utilisez ne sont pas supérieures aux limites de la hauteur de ligne. Selon la documentation : "... les glyphes et les graphiques dépassant cette hauteur chevaucheront les lignes voisines...". Bien que cette limite s'applique à la ligne elle-même, l'interligne ajoute un espace supplémentaire entre les lignes adjacentes."

1 votes

+1, Si vous voulez réduire l'espacement entre les lignes, c'est ce que vous voulez faire. L'espacement réel entre les lignes est très probablement de 0 par défaut, c'est pourquoi les gens disent que vous ne pouvez que l'augmenter. Le problème de l'espacement trop grand vient de la hauteur de la ligne qui est trop grande, c'est pourquoi cela fera l'affaire dans 99% des cas.

2 votes

C'est la seule réponse que j'ai pu trouver qui utilise la valeur réelle de la hauteur de ligne (au lieu d'un ratio) commune aux applications de conception telles que Photoshop, Sketch, CSS, etc.

19voto

Dreamwieber Points 334

Il existe une autre solution dans iOS 6, qui consiste à définir un texte attribué sur l'étiquette, en utilisant une NSAttributedString avec les styles de paragraphe appropriés. Voir cette réponse de stack overflow pour plus de détails sur la hauteur de ligne avec NSAttributedString :

Texte de base - La hauteur des lignes de la NSAttributedString est-elle correcte ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X