web-dev-qa-db-ja.com

UITextViewでNSAttributedStringにフォントを設定すると、行間隔が無視されます

IOS 6で、属性付き文字列をUITextViewに設定しようとしています。問題は、属性付き文字列にフォントプロパティを設定しようとすると、行間が無視されることです。ただし、フォントを設定せず、デフォルトのフォントが使用されている場合、行間は機能します。

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;

何が起こっているのでしょうか?

72
Snowman

属性文字列プログラミングガイド:

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:メソッドを使用しようとしましたが、iOS 6シミュレーターで動作していないようです:

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

ログには正しく追加された属性が表示されるようですが、iOSシミュレーターのビューには属性が表示されませんでした。

102
maxeng

NSAttributedStringと戦っていたので、あなたの質問を見つけました。私にとって、beginEditingおよびendEditingメソッドは、 属性付き文字列の変更 で述べたようなトリックを行いました。それとは別に、lineSpacingは、paragraphStyleの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;

ただし、この正確なコードはテストしませんでしたが、私の見た目はほとんど同じです。

編集:

その間、私はそれをテストしました、そして私が間違っているなら私を修正します、- beginEditing- endEditing呼び出しは非常に重要であるようです。

24
Jan Nash
//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];
3
Nitin Mehta

IOS 6には、フォントが設定されている場合に行の高さが無視されるというバグがありました。 NSParagraphStyle行間隔は無視されます および レーダー:UITextViewは属性付き文字列の最小/最大行高さを無視する でのより長いバグ分析への回答を参照してください。

3
Palimondo

この例 を使用して、実装を次のように変更できます。

[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];
              }];
1
landonandrey