失敗した簡単なテスト: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}];
}
行間隔は、属性が存在しない場合と同じです。これが正常に動作するようになったものはありますか?私はそれが変わらないことを示すためにばかげた数字を入れました...
これは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に言及することをお勧めします。
これで目的に十分かどうかはわかりませんが、最小および最大の行の高さを設定して行間隔を調整できます。さらに、フォントを使用するには、属性ディクショナリのfont
の値として渡すのではなく、テキストビューのNSFontAttributeName
プロパティに入れます。 (おそらく、この部分は文書化されていませんか?)
lineSpacing
は行の下部から上部の行の下部まで計算され、そのスペースはminimumLineHeight
とmiximumLineHeight
の間の値に制限されます。私が言いたいのは、あなたの属性のいくつかの値が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];
同じ行に日本語/中国語と他の文字とアルファベット文字が混在している状況があるようです。それは、その行をより大きくリードにして、私がしたように最小および最大の行の高さを設定する必要があることを解決します。私の例を属性なしでレンダリングするときに問題を見ることができます。
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];
この特定の文字列では、代わりにparagraphSpacing
を設定する必要があります。 lineSpacing
については、iOSではまだサポートされていないと思います。
私の場合、どの段落スタイルも機能していませんでした。修正は、ラベルのフレーム調整を行った後に、ラベルの属性付きテキストを設定することでした。 :)
Nacho4dが答えたように、iOS 6でminimumLineHeightとmaximumLineHeightを使用し、ITextViewで直接フォントを設定する必要がありますin NSAttributedStringその場合の行の高さが上書きされるため。
ITextViewでフォントを設定する場合、ITextViewの"editable"プロパティは[〜#〜 ] yes [〜#〜]、他の場合は属性付きテキストは影響を受けません。
これらの問題はiOS 6にのみ存在します。 iOS 7以上ではすべて問題ありません。