Beim Festlegen der Schriftart in NSAttributedString in UITextView wird der Zeilenabstand nicht berücksichtigt

73

Ich versuche, eine zugewiesene Zeichenfolge für eine UITextView in iOS 6 festzulegen. Das Problem ist, dass der Zeilenabstand ignoriert wird, wenn ich versuche, die Schriftart-Eigenschaft für die zugewiesene Zeichenfolge festzulegen. Wenn ich jedoch die Schriftart nicht einstelle und die Standardschriftart verwendet wird, funktioniert der Zeilenabstand.

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;

Irgendeine Idee, was los ist?

Schneemann
quelle
3
Planen Sie eine Antwort zu akzeptieren oder hat Ihnen keine Antwort geholfen? :)
Jan Nash
Ja, ich denke schon. Siehe meine Antwort unten :)
Jan Nash
Hey, es wäre immer noch cool, wenn du eine Antwort akzeptieren würdest, wenn es eine gäbe, die dir hilft.
Jan Nash

Antworten:

105

Programmierhandbuch für zugewiesene Zeichenfolgen:

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

Update: Ich habe versucht, die addAttribute:Methode in meiner eigenen App zu verwenden, aber sie schien auf dem iOS 6-Simulator nicht zu funktionieren:

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

Das Protokoll scheint korrekt hinzugefügte Attribute anzuzeigen, aber die Ansicht im iOS-Simulator wurde nicht mit Attributen angezeigt.

maxeng
quelle
6
Ich hatte das gleiche Problem beim Versuch, Attribut hinzuzufügen. Ich habe deine Antwort ausprobiert und es hat sogar nicht funktioniert. Irgendein Rat?? Ich denke, Sie sollten Ihre Antwort auf UIFont anstelle von NSFont bearbeiten, wenn wir über IOS sprechen.
iosMentalist
6
Ich weiß nicht, warum die Leute diese Antwort abstimmen. Das eigentliche Problem wird dadurch nicht behoben.
Schneemann
2
Diese Antwort ist etwas alt, also verwenden Sie: UIFont * font = [UIFont fontWithName: @ "Palatino-Roman" Größe: 14.0] zu beheben
simon_smiley
Funktioniert natürlich immer noch nicht. Es scheint, dass das Hinzufügen oder sogar Festlegen von Attributen keine Auswirkung auf die zugewiesene Zeichenfolge hat.
Micrified
Es tut mir leid, aber das ist immer noch keine Antwort.
Jan Nash
24

Ich habe Ihre Frage gefunden, weil ich auch mit NSAttributedString gekämpft habe. Für mich haben die Methoden beginEditingund endEditingden Trick ausgeführt, wie unter Ändern einer zugewiesenen Zeichenfolge angegeben . Abgesehen davon wird der Zeilenabstand im Absatzstil festgelegt setLineSpacing.

Vielleicht möchten Sie versuchen, Ihren Code zu ändern in:

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;

Ich habe diesen genauen Code zwar nicht getestet, aber meiner sieht fast gleich aus.

BEARBEITEN:

In der Zwischenzeit habe ich es getestet und, korrigieren Sie mich, wenn ich falsch liege, scheinen die - beginEditingund - endEditing-Anrufe von großer Bedeutung zu sein.

Jan Nash
quelle
4
//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];
Nitin Mehta
quelle
1

Sie können dieses Beispiel verwenden und die Implementierung folgendermaßen ändern:

[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];
              }];
Landonandrey
quelle