10

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

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

所以我的问题是,你是如何做到这一点的,或者你如何处理这种设计变更?

4

4 回答 4

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 文件本身中是硬编码的。使用字体选择器选择您需要的字体。

于 2013-07-02T06:59:48.600 回答
11

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

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

界面外观 API

于 2013-07-01T23:14:27.587 回答
4

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

于 2013-07-01T22:25:57.127 回答
3

对于那些在故事板中寻找解决方案的人,我在文本编辑器中打开故事板文件并进行搜索/替换时取得了一些成功。你必须抓住你想改变的每种字体(例如粗体/斜体),但我能够用 HelveticaNeue UltraLight 替换标准系统字体,方法是:

key="fontDescription" type="system"

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

对于粗体,您将替换:

key="fontDescription" type="boldSystem"

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

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

于 2013-10-28T15:57:54.803 回答