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

Mob*_*ent 10 iphone ios ios7

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

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

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

Leo*_*ica 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
Run Code Online (Sandbox Code Playgroud)

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

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


Mar*_*kle 11

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

 [[UILabel appearance] setFont:[UIFont fontWithName:@"YourFontName" size:14.0]];
Run Code Online (Sandbox Code Playgroud)

UIAppearance API

  • 如果您的标签需要不同的字体_sizes_,它将无法正常工作.此解决方案实际上仅适用于简单的应用程序. (2认同)