Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS 7和Helvetica Neue UltraLight:用作旧iOS版本的默认设置_Iphone_Ios_Ios7 - Fatal编程技术网

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

Iphone iOS 7和Helvetica Neue UltraLight:用作旧iOS版本的默认设置,iphone,ios,ios7,Iphone,Ios,Ios7,据我所知,iOS 7的默认字体是Helvetica Neue UltraLight,与粗体的前身相比,它要薄得多。为了提供一致的设计并使我即将发布的应用程序在所有常见的iOS版本中看起来都一样,我想将Helvetica Neue UltraLight应用为应用程序的默认(主要)字体 令人高兴的是,这种“新字体”是可用的,因此它已经得到了iOS 7之前版本的支持。遗憾的是,我找到了使用它的唯一方法,就是在每个UIView的字体上手动调用[UIFont fontWithName:@“Helvetic

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

令人高兴的是,这种“新字体”是可用的,因此它已经得到了iOS 7之前版本的支持。遗憾的是,我找到了使用它的唯一方法,就是在每个UIView的字体上手动调用
[UIFont fontWithName:@“HelveticaNeue UltraLight”size:size]
,这既繁琐又容易出错


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

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

为什么不使用外观API

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

以下是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具有超轻字体,对于粗体请求,具有中等字体)


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

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

key="fontDescription" type="system"

对于粗体,您将替换:

key="fontDescription" type="boldSystem"
我选择用同样的超轻字体替换粗体字体,但对于那些想要“粗体”处理的人,你可以选择“HelveticaNeue-Thin”



我建议在执行此操作之前使用版本控制或备份文件ui标签
font
属性未标记为
ui外观
选择器。我不认为这会起作用。如果你有需要不同字体大小的标签,它不会起作用。这个解决方案实际上只适用于普通的应用程序。它不起作用。异常抛出“NSInvalidArgumentException”,原因:“+[UIFont systemFontOfSize:weight:::未识别的选择器发送到类”。非常有趣。我的无知:我收集到每次创建UIFont对象时都会调用
load
方法。谁或什么代码调用此方法?这是Objective-C的副作用吗?当Objective-C运行时加载类时,通常在应用程序启动期间调用load方法(更具体地说,是在iOS启动期间加载动态库时)。您可能希望在类别上使用前缀,如果它们与
UIFont
@LeoNatan上的内部方法发生冲突,非常感谢!如果我们需要轻量版的Helvetica,你会推荐什么?systemFontOfSize:weight:仅在ios 8.2及更高版本中可用。@Danik这在技术上是不正确的
systemFontOfSize:weight:
自iOS 8.0开始提供,与私有API一样。所以你可以使用它,只要你的目标是8.0及以上。
key="fontDescription" type="boldSystem"