75 votes

Le réglage de la police de NSAttributedString dans UITextView ne tient pas compte de l'interligne.

J'essaie de définir une chaîne attribuée à une UITextView dans iOS 6. Le problème est que si j'essaie de définir la propriété de police sur la chaîne attribuée, l'interlignage est ignoré. Toutefois, si je ne définis pas la police et que la police par défaut est utilisée, l'interlignage fonctionne.

NSString *string = @" Hello \n world";
attrString = [[NSMutableAttributedString alloc] initWithString:string];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];

paragraphStyle.minimumLineHeight = 50;
// setting the font below makes line spacing become ignored
[attrString addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:20] range:NSMakeRange(0, string.length)];
[attrString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, string.length)];

mainTextView.attributedText = attrString;

Une idée de ce qui se passe ?

3 votes

Avez-vous l'intention d'accepter une réponse ou l'absence de réponse vous a-t-elle aidé ? :)

0 votes

Oui, je le pense. Voir ma réponse ci-dessous :)

0 votes

Hé, ce serait quand même cool, si tu acceptais une réponse, s'il y en a une qui t'a aidé.

106voto

maxeng Points 392

Guide de programmation des chaînes attribuées :

UIFont *font = [UIFont fontWithName:@"Palatino-Roman" size:14.0];
NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:font
                                forKey:NSFontAttributeName];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:@"strigil" attributes:attrsDictionary];

Mise à jour : j'ai essayé d'utiliser addAttribute: dans ma propre application, mais elle ne semblait pas fonctionner dans le simulateur iOS 6 :

NSLog(@"%@", textView.attributedText);

Le journal semble montrer que les attributs ont été correctement ajoutés, mais la vue sur le simulateur iOS ne s'affiche pas avec les attributs.

6 votes

J'ai eu le même problème en essayant d'ajouter un attribut. J'ai essayé votre réponse et cela n'a même pas fonctionné. Un conseil ? Je pense que vous devriez modifier votre réponse en remplaçant UIFont par NSFont si nous parlons d'IOS.

6 votes

Je ne sais pas pourquoi les gens votent pour cette réponse. Elle ne résout pas le problème actuel.

2 votes

Cette réponse est un peu ancienne donc à utiliser : UIFont * font = [UIFont fontWithName : @"Palatino-Roman" size:14.0] pour résoudre le problème.

26voto

Jan Nash Points 927

J'ai trouvé votre question parce que je me battais aussi avec NSAttributedString. Pour moi, le beginEditing y endEditing ont fait l'affaire, comme indiqué dans Modification d'une chaîne attribuée . En outre, l'espacement des lignes est défini à l'aide de la fonction setLineSpacing sur le paragraphStyle.

Vous pouvez donc essayer de changer votre code en :

NSString *string = @" Hello \n world";
attrString = [[NSMutableAttributedString alloc] initWithString:string];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];

[paragraphStyle setLineSpacing:20]  // Or whatever (positive) value you like...    
[attrSting beginEditing];

[attrString addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:20] range:NSMakeRange(0, string.length)];
[attrString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, string.length)];

[attrString endEditing];

mainTextView.attributedText = attrString;

Je n'ai pas testé ce code exact, mais le mien est presque le même.

EDIT :

Entre-temps, je l'ai testé, et, corrigez-moi si je me trompe, les - beginEditing y - endEditing Les appels semblent être d'une grande importance.

5voto

Nitin Mehta Points 117
//For proper line spacing

NSString *text1 = @"Hello";
NSString *text2 = @"\nWorld";
UIFont *text1Font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:10];
NSMutableAttributedString *attributedString1 =
[[NSMutableAttributedString alloc] initWithString:text1 attributes:@{ NSFontAttributeName : text1Font }];
NSMutableParagraphStyle *paragraphStyle1 = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle1 setAlignment:NSTextAlignmentCenter];
[paragraphStyle1 setLineSpacing:4];
[attributedString1 addAttribute:NSParagraphStyleAttributeName value:paragraphStyle1 range:NSMakeRange(0, [attributedString1 length])];

UIFont *text2Font = [UIFont fontWithName:@"HelveticaNeue-Medium" size:16];
NSMutableAttributedString *attributedString2 =
[[NSMutableAttributedString alloc] initWithString:text2 attributes:@{NSFontAttributeName : text2Font }];
NSMutableParagraphStyle *paragraphStyle2 = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle2 setLineSpacing:4];
[paragraphStyle2 setAlignment:NSTextAlignmentCenter];
[attributedString2 addAttribute:NSParagraphStyleAttributeName value:paragraphStyle2 range:NSMakeRange(0, [attributedString2 length])];

[attributedString1 appendAttributedString:attributedString2];

3voto

Palimondo Points 2337

Il y avait un bogue dans iOS 6, qui fait que la hauteur de ligne est ignorée lorsque la police est définie. Voir la réponse à NSParagraphStyle espacement des lignes ignoré et une analyse plus longue des bogues à Radar : UITextView ignore la hauteur de ligne minimale/maximale dans la chaîne attribuée .

1voto

landonandrey Points 64

Vous pouvez utiliser cet exemple et changer son implémentation comme ceci :

[self enumerateAttribute:NSParagraphStyleAttributeName
                 inRange:NSMakeRange(0, self.length)
                 options:0
              usingBlock:^(id  _Nullable value, NSRange range, BOOL * _Nonnull stop) {
                  NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];

                  //add your specific settings for paragraph
                  //...
                  //...

                  [self removeAttribute:NSParagraphStyleAttributeName range:range];
                  [self addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:range];
              }];

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