24

失敗した簡単なテスト: サブビュー (UITextView) を 1 つだけ使用して新しいプロジェクトを作成し、次のように記述します。

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

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

4

6 に答える 6

24

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

この問題は、見逃されがちなフォントの CSS ショートハンドの特殊性に起因しています。font 省略形でピクセル サイズを指定すると、font-size と line-height の両方が設定されます。NSHTMLWriter は line-height の後にフォントを配置するため、line-height がフォント サイズによって相殺されます。

バグの完全な分析を含む私のレーダーについては、こちらを参照してください。

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

于 2012-12-16T16:48:10.210 に答える
23

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

あなたの属性について

lineSpacingは行の下部から上部の行の下部まで計算され、そのスペースは ~ の間の値に制限されminimumLineHeightますmiximumLineHeight。私が言おうとしているのは、属性の一部の値が他の値をキャンセルまたはオーバーライドしている可能性があるということです。

また、行間の間隔を調整する必要がある場合は、おそらく使用する必要はありません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];

その他の注意事項

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

于 2012-10-06T14:32:38.413 に答える
9

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

重なる線

于 2012-12-05T09:22:37.830 に答える
5

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

于 2012-09-24T09:57:28.140 に答える
0

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

于 2014-12-23T18:57:27.893 に答える
0

nacho4d が答えたように、iOS 6では、行の高さがオーバーライドされるため、 NSAttributedStringではなく、minimumLineHeightmaximumLineHeightを使用してフォントを UITextView に直接設定する必要があります。

UITextView でフォントを設定する場合、UITextView「編集可能」プロパティをYESに設定する必要があることに注意してください。そうしないと、属性付きのテキストは影響を受けません。

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

于 2014-06-15T14:29:37.320 に答える