web-dev-qa-db-ja.com

UILabelの外観フォントと属性付き文字列フォント

私のアプリでは、次のようにすべてのラベルにグローバルカスタムフォントを適用しています。

UIFont *font = [UIFont fontWithName:kMyFontName size:15.0]; 
[[UILabel appearance] setFont:font];

これは正常に機能します。ただし、UILabel文字列の特定の領域に別のフォントを指定できるようにしたい場合があります。

だから私はこのようなものを持っています:

NSString *string = @"Foo Bar Baz";
UIFont *boldFont = [UIFont fontWithName:kMyBoldFontName size:15.0]; 
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
[attrString setAttributes:@{ NSFontAttributeName: boldFont } range:NSMakeRange(0, 3)];
self.myLabel.attributedText = attrString;

ただし、これは機能していないようです。 「Foo」は太字になると思いますが、文字列全体がデフォルトのフォントになっています。これは、太字のフォントがまったく適用されておらず、UILabel外観プロキシで設定されたフォントによって上書きされているかのようです。

UILabelの外観行を削除すると、正常に機能します(文字列の一部が太字で表示されます)。基本的に、カスタムフォントをラベルに適用したいのですが、別のフォントを文字列の別の領域に適用します。通常、これは属性付き文字列で正常に機能しますが、何らかの理由でUILabelの外観フォントを設定するとこの機能が無効になります(またはそう思われます)。

  • 期待される結果: "Foo Bar Baz"
  • 実際の結果:「FooBarBaz」

[[UILabel appearance] setFont:]行を削除すると、機能します。

  • "Foo Bar Baz"

(ただし、カスタムフォントは文字列の残りの部分には設定されません)。

だから私の質問は:デフォルトのアプリ全体として使用する単一のフォントを指定する方法はありますが、属性付きの文字列を使用してそれを部分的にオーバーライドすることはできますか?

また、なぜこれが機能しないのか誰かが私に説明できれば、私はそれをいただければ幸いです。

14
nebs

属性付きテキストとプレーンテキストを組み合わせて一致させることはできません。 setFontメソッドを削除すると機能するのはそのためです。これを使用すると、プレーンテキストのUILabelが想定されるためです。

NSString *string = @"Foo Bar Baz";
UIFont *boldFont = [UIFont fontWithName:kMyBoldFontName size:15.0]; 
// Define your regular font
UIFont *regularFont = [UIFont fontWithName:kMyFontName size:15.0];
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:string];
// And before you set the bold range, set your attributed string (the whole range!) to the new attributed font name
[attrString setAttributes:@{ NSFontAttributeName: regularFont } range:NSMakeRange(0, string.length - 1)];
[attrString setAttributes:@{ NSFontAttributeName: boldFont } range:NSMakeRange(0, 3)];
self.myLabel.attributedText = attrString;
11
brandonscript

属性文字列を設定する直前に、fontとtextColorをnilに設定します。

14
ksysu

2つの重要な部分があります:

  1. UIAppearanceは、UI要素をウィンドウに追加するときに適用されます
  2. labelInstance.font = ...現在設定されている属性文字列のすべてのフォント属性をリセットします

したがって、UIAppearanceのカスタマイズを維持したい場合は、ラベルがウィンドウに追加された後にカスタム属性文字列を設定する必要があります。

UIAppearanceがどのように機能するかについての参照記事: Peter Steinbergerのクールな記事

3
Andrew Vyazovoy