web-dev-qa-db-ja.com

iOS7およびHelveticaNeue UltraLight:古いiOSバージョンのデフォルトとして使用

私の知る限り、iOS 7のデフォルトフォントはHelvetica Neue UltraLightで、前作の大胆なフォントに比べてはるかに薄くなっています。一貫したデザインを提供し、今後のアプリをすべての一般的なiOSバージョンで同じように見せるために、アプリのデフォルト(プライマリ)フォントとしてHelvetica NeueUltraLightを適用したいと思います。

嬉しいことに、この「新しいフォント」は利用可能です iOSバージョン5.0以降 、iOS 7より前のバージョンではすでにサポートされています。残念ながら、私がそれを使用するために考え出した唯一の方法は、手動で[UIFont fontWithName:@"HelveticaNeue-UltraLight" size:size]を呼び出すことです。各UIViewのフォントは、面倒でエラーが発生しやすく、一貫性がありません。

だから私の質問は、これを行うためのあなたの方法は何ですか、またはこの設計変更をどのように処理しますか?

10
Mobiletainment

これが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ファイルとストーリーボードファイルからビューをロードする場合は機能しません。フォントピッカーを使用して、必要なフォントを選択します。

18
Leo Natan

外観APIを使用しないのはなぜですか?

 [[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:14.0]];

IAppearance API

11
Mark McCorkle

メソッド名を具体的に指定することでNDA)を壊すことなく、動的型の新しいメソッドを模倣するためにUIFontでカテゴリを宣言してみませんか?

4
Adam Eberbach

ストーリーボードで解決策を探している人のために、テキストエディタでストーリーボードファイルを開いて検索/置換を行うことに成功しました。変更するフォントの種類(太字/斜体など)をそれぞれキャッチする必要がありますが、次のものを置き換えることで、標準のシステムフォントをHelveticaNeueUltraLightに置き換えることができました。

key="fontDescription" type="system"

key="fontDescription" name="HelveticaNeue-UltraLight" family="Helvetica Neue"

太字の場合は、次を置き換えます。

key="fontDescription" type="boldSystem"

太字のフォントを同じUltraLightフォントに置き換えることにしましたが、「太字」の扱いが必要な場合は、「HelveticaNeue-Thin」を選択できます。

ただし、これを行う前に、バージョン管理を使用するか、ファイルのバックアップコピーを作成することをお勧めします。

3
Pat