私の知る限り、iOS 7のデフォルトフォントはHelvetica Neue UltraLightで、前作の大胆なフォントに比べてはるかに薄くなっています。一貫したデザインを提供し、今後のアプリをすべての一般的なiOSバージョンで同じように見せるために、アプリのデフォルト(プライマリ)フォントとしてHelvetica NeueUltraLightを適用したいと思います。
嬉しいことに、この「新しいフォント」は利用可能です iOSバージョン5.0以降 、iOS 7より前のバージョンではすでにサポートされています。残念ながら、私がそれを使用するために考え出した唯一の方法は、手動で[UIFont fontWithName:@"HelveticaNeue-UltraLight" size:size]
を呼び出すことです。各UIViewのフォントは、面倒でエラーが発生しやすく、一貫性がありません。
だから私の質問は、これを行うためのあなたの方法は何ですか、またはこの設計変更をどのように処理しますか?
これがObjective-Cランタイムソリューションです。
@interface UIFont (CustomSystemFont)
+ (UIFont *)ln_systemFontOfSize:(CGFloat)fontSize;
+ (UIFont *)ln_boldSystemFontOfSize:(CGFloat)fontSize;
+ (UIFont *)ln_italicSystemFontOfSize:(CGFloat)fontSize;
@end
@implementation UIFont (CustomSystemFont)
+ (void)load
{
Method orig = class_getClassMethod([UIFont class], @selector(systemFontOfSize:));
Method swiz = class_getClassMethod([UIFont class], @selector(ln_systemFontOfSize:));
method_exchangeImplementations(orig, swiz);
orig = class_getClassMethod([UIFont class], @selector(boldSystemFontOfSize:));
swiz = class_getClassMethod([UIFont class], @selector(ln_boldSystemFontOfSize:));
method_exchangeImplementations(orig, swiz);
orig = class_getClassMethod([UIFont class], @selector(italicSystemFontOfSize:));
swiz = class_getClassMethod([UIFont class], @selector(ln_italicSystemFontOfSize:));
method_exchangeImplementations(orig, swiz);
}
+ (UIFont *)ln_systemFontOfSize:(CGFloat)fontSize
{
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
{
//Call original implementation.
return [self ln_systemFontOfSize:fontSize];
}
return [UIFont fontWithName:@"HelveticaNeue" size:fontSize];
}
+ (UIFont *)ln_boldSystemFontOfSize:(CGFloat)fontSize
{
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
{
//Call original implementation.
return [self ln_systemFontOfSize:fontSize];
}
return [UIFont fontWithName:@"HelveticaNeue-Medium" size:fontSize];
}
+ (UIFont *)ln_italicSystemFontOfSize:(CGFloat)fontSize
{
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
{
//Call original implementation.
return [self ln_systemFontOfSize:fontSize];
}
return [UIFont fontWithName:@"HelveticaNeue-Italic" size:fontSize];
}
@end
この例で行うことは、3つのシステムフォントメソッドを独自のメソッドに置き換えて、システムバージョンが7以上かどうかをテストすることです。そうである場合は、元のメソッドを使用します。それ以外の場合は、選択したフォントを返します(この場合、通常および斜体のリクエストにはUltraLightウェイト、太字のリクエストにはMediumウェイトのHelvetica Neue)。
これは、システムで作成されたビューを含む、コードで生成されたすべてのものに対して機能します。フォントはNIBファイル自体にハードコードされているため、Xibファイルとストーリーボードファイルからビューをロードする場合は機能しません。フォントピッカーを使用して、必要なフォントを選択します。
外観APIを使用しないのはなぜですか?
[[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:14.0]];
メソッド名を具体的に指定することでNDA)を壊すことなく、動的型の新しいメソッドを模倣するためにUIFontでカテゴリを宣言してみませんか?
ストーリーボードで解決策を探している人のために、テキストエディタでストーリーボードファイルを開いて検索/置換を行うことに成功しました。変更するフォントの種類(太字/斜体など)をそれぞれキャッチする必要がありますが、次のものを置き換えることで、標準のシステムフォントをHelveticaNeueUltraLightに置き換えることができました。
key="fontDescription" type="system"
と
key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue"
太字の場合は、次を置き換えます。
key="fontDescription" type="boldSystem"
太字のフォントを同じUltraLightフォントに置き換えることにしましたが、「太字」の扱いが必要な場合は、「HelveticaNeue-Thin」を選択できます。
ただし、これを行う前に、バージョン管理を使用するか、ファイルのバックアップコピーを作成することをお勧めします。