iOS 7和Helvetica Neue UltraLight:用作旧版iOS的默认设置

时间:2013-07-01 22:20:43

标签: iphone ios ios7

据我所知,iOS 7的默认字体是 Helvetica Neue UltraLight ,与其大胆的前辈相比要薄得多。为了提供一致的设计并使我即将推出的应用程序在所有常见iOS版本中看起来相同,我想将Helvetica Neue UltraLight应用为应用程序的默认(主要)字体。

很高兴,这个“新字体”可用since iOS version 5.0,因此iOS 7之前的版本已经支持它。可悲的是,我想出使用它的唯一方法是手动调用[UIFont fontWithName:@"HelveticaNeue-UltraLight" size:size]在每个UIView的字体上,这是乏味且容易出错的。

所以我的问题是,你这样做的方法是什么,或者你如何处理这种设计变化?

4 个答案:

答案 0 :(得分:18)

这是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

我在这个例子中做的是用我自己的三个系统字体方法替换并测试系统版本是7还是以上。如果是,我使用原始方法,否则返回我选择的字体(在这种情况下,Helvetica Neue使用UltraLight权重进行常规和斜体请求,使用中等权重进行粗体请求)。

这适用于代码中生成的所有内容,包括系统创建的视图。从Xib和Storyboard文件加载视图时它不起作用,因为字体在NIB文件本身中是硬编码的。使用字体选择器选择所需的字体。

答案 1 :(得分:11)

为什么不直接使用外观API?

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

UIAppearance API

答案 2 :(得分:4)

通过具体说明方法名称而不破坏NDA - 为什么不在UIFont上声明一个类别来模仿动态类型的新方法?

答案 3 :(得分:3)

对于那些在故事板中寻找解决方案的人,我在文本编辑器中打开故事板文件并进行搜索/替换取得了一些成功。您必须捕获要更改的每种类型的字体(例如Bold / Italic),但我可以通过替换以下内容替换HelveticaNeue UltraLight的标准系统字体:

key="fontDescription" type="system"

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

对于粗体,您将替换:

key="fontDescription" type="boldSystem"

我选择使用相同的UltraLight字体替换粗体字体,但对于那些想要“大胆”处理的人,您可以选择“HelveticaNeue-Thin”。

我建议您在执行此操作之前使用版本控制或制作文件的备份副本!