web-dev-qa-db-ja.com

NSParagraphStyle行間隔は無視されます

失敗した簡単なテスト:1つのサブビュー(UITextView)だけで新しいプロジェクトを作成し、次を配置します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.lineHeightMultiple = 50.f;
    paragraphStyle.lineSpacing = 100.f;
    paragraphStyle.minimumLineHeight = 200.f;
    paragraphStyle.maximumLineHeight = 500.f;

    UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:24.f];

    self.textView.attributedText = [[NSAttributedString alloc] initWithString:
    @"This is a test.\n Will I pass?" attributes:
    @{NSParagraphStyleAttributeName : paragraphStyle, NSFontAttributeName : font}];
}

行間隔は、属性が存在しない場合と同じです。これが正常に動作するようになったものはありますか?私はそれが変わらないことを示すためにばかげた数字を入れました...

24
borrrden

これはNSHTMLWriterのバグで、UITextViewがattributedTextをHTMLに変換するために使用するプライベートクラスです。内部的には、UIWebDocumentViewを介してこのHTMLを表示します。私の記事のUITextViewの内部の仕組みについては、こちらをご覧ください。 http://www.cocoanetics.com/2012/12/uitextview-caught-with-trousers-down/

問題は、フォントCSSの省略表現の専門を見逃しやすいためです。フォントの簡略表記でピクセルサイズを指定すると、フォントサイズと行の高さの両方が設定されます。 NSHTMLWriterはフォントを行の高さの後に配置するため、行の高さはフォントサイズによってキャンセルされます。

バグの完全な分析を含む私のレーダーについてはこちらを参照してください: http://www.cocoanetics.com/2012/12/radar-uitextview-ignores-minimummaximum-line-height-in-attributed-string/

バグレポートも提出して、レーダー#12863734に言及することをお勧めします。

24
Cocoanetics

これで目的に十分かどうかはわかりませんが、最小および最大の行の高さを設定して行間隔を調整できます。さらに、フォントを使用するには、属性ディクショナリのfontの値として渡すのではなく、テキストビューのNSFontAttributeNameプロパティに入れます。 (おそらく、この部分は文書化されていませんか?)

あなたの属性について

lineSpacingは行の下部から上部の行の下部まで計算され、そのスペースはminimumLineHeightmiximumLineHeightの間の値に制限されます。私が言いたいのは、あなたの属性のいくつかの値がcancellingまたはoverridingその他。

また、行間の間隔を調整する必要がある場合は、おそらくparagraphStyle.lineHeightMultipleを使用する必要はありません:)

コード

これは私のために働いた:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.minimumLineHeight = 35.f;
paragraphStyle.maximumLineHeight = 35.f;

UIFont *font = [UIFont fontWithName:@"AmericanTypewriter" size:18.f];
NSString *string = @"This is a test.\nWill I pass?\n日本語のもじもあるEnglish\nEnglish y Español";
NSDictionary *attributtes = @{
    NSParagraphStyleAttributeName : paragraphStyle,
};
self.textView.font = font;
self.textView.attributedText = [[NSAttributedString alloc] initWithString:string
                                 attributes:attributtes];

その他の注意事項

同じ行に日本語/中国語と他の文字とアルファベット文字が混在している状況があるようです。それは、その行をより大きくリードにして、私がしたように最小および最大の行の高さを設定する必要があることを解決します。私の例を属性なしでレンダリングするときに問題を見ることができます。

23
nacho4d

MaximumLineHeightを設定すると、この問題は解決されるようです。

CGFloat fontSize = 22.f;
titleLabel.font = [UIFont boldSystemFontOfSize:fontSize];
NSMutableParagraphStyle *paragraphStyle = [[[NSMutableParagraphStyle  alloc] init] autorelease];
paragraphStyle.maximumLineHeight = fontSize/2;
titleLabel.attributedText = [[[NSAttributedString alloc]
                              initWithString:@"This is a test.\nWill I pass?"
                              attributes: @{ NSParagraphStyleAttributeName : paragraphStyle,
                                             NSFontAttributeName : titleLabel.font}]
                             autorelease];

overlapping lines

8
Henrik Hartz

この特定の文字列では、代わりにparagraphSpacingを設定する必要があります。 lineSpacingについては、iOSではまだサポートされていないと思います。

5
pronvit

私の場合、どの段落スタイルも機能していませんでした。修正は、ラベルのフレーム調整を行った後に、ラベルの属性付きテキストを設定することでした。 :)

0
Erik Villegas

Nacho4dが答えたように、iOS 6minimumLineHeightmaximumLineHeightを使用し、ITextViewで直接フォントを設定する必要がありますin NSAttributedStringその場合の行の高さが上書きされるため。

ITextViewでフォントを設定する場合、ITextView"editable"プロパティは[〜#〜 ] yes [〜#〜]、他の場合は属性付きテキストは影響を受けません。

これらの問題はiOS 6にのみ存在します。 iOS 7以上ではすべて問題ありません。

0
Hordaric