在UITextView的NSAttributedString上设置字体不考虑行距


73

我正在尝试将属性字符串设置为iOS 6中的UITextView。问题是,如果我尝试在属性字符串上设置font属性,则会忽略行距。但是,如果我未设置字体,并且使用了默认字体,则行距有效。

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;

知道发生了什么吗?


3
您打算接受答案还是没有答案帮助您?:)
Jan Nash

是的,我想是这样。请参阅下面的答案:)
Jan Nash

嘿,如果您接受了一个答案,并且有一个可以帮助您的答案,那仍然很酷。
Jan Nash

Answers:


105

属性字符串编程指南:

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

更新:我尝试addAttribute:在自己的应用中使用method,但在iOS 6 Simulator上似乎无法正常工作:

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

日志似乎显示了正确添加的属性,但是iOS模拟器上的视图未显示属性。


6
尝试添加属性时,我遇到了同样的问题。我尝试了您的答案,但是它甚至没有用。有什么建议吗?? 我认为,如果我们正在谈论IOS,则应该编辑UIFont的答案而不是NSFont。
iosMentalist 2013年

6
我不知道为什么人们投票赞成这个答案。它不能解决实际问题。
雪人2014年

2
这个答案有点老了,所以使用:UIFont * font = [UIFont fontWithName:@“ Palatino-Roman” size:14.0]要解决
simon_smiley 2014年

当然仍然无法正常工作。似乎添加甚至设置属性对属性字符串都没有影响。
失误

对不起,但这仍然不是答案。
Jan Nash

25

我找到了您的问题,因为我也在与NSAttributedString进行斗争。对我来说,beginEditingendEditing方法可以解决问题,就像更改属性字符串中所述。除此之外,lineSpacing设置setLineSpacing在段落样式上。

因此,您可能想尝试将代码更改为:

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;

顺便说一句,虽然没有测试这个确切的代码,但是我的看起来差不多。

编辑:

同时,我已经对其进行了测试,如果我错了,请更正我,并且- beginEditingand- endEditing调用似乎非常重要。


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];


1

您可以使用此示例并按如下所示更改其实现:

[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];
              }];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.