Iphone iOS 7和Helvetica Neue UltraLight:用作旧iOS版本的默认设置
据我所知,iOS 7的默认字体是Helvetica Neue UltraLight,与粗体的前身相比,它要薄得多。为了提供一致的设计并使我即将发布的应用程序在所有常见的iOS版本中看起来都一样,我想将Helvetica Neue UltraLight应用为应用程序的默认(主要)字体 令人高兴的是,这种“新字体”是可用的,因此它已经得到了iOS 7之前版本的支持。遗憾的是,我找到了使用它的唯一方法,就是在每个UIView的字体上手动调用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
[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”
我建议在执行此操作之前使用版本控制或备份文件一个要考虑的事情——iOS 6用户想要看起来像iOS 6的应用程序。iOS 7用户希望应用程序看起来像iOS 7。我个人认为,在iOS 6下运行时,你的应用程序应该使用默认的iOS 6字体。图标也一样。但这只是一种观点。我认为将iOS7的元素吸收到当前的iOS 6应用程序中是个好主意,但前提是整体“主题”允许这样做。这样,6和7就不一定需要完全不同的版本,至少在大多数用户安装了7之后是这样。@rmaddy:iOS7是一个巨大的飞跃。在这一点上,我认为iOS6用户将很幸运能够得到任何支持,更不用说为在iOS7中运行而定制的应用程序了,而且在iOS6中看起来也不错。不要后悔!我也希望有一个更好的解决方案。这些类型的解决方案都是黑客攻击,但当没有其他解决方案时,黑客攻击就可以了。根据接口指南:“应用程序在其支持的所有iOS版本中使用相同的应用程序图标。如果您决定为您的应用程序的iOS 7版本重新设计应用程序图标,即使应用程序在不同的iOS版本中显示不同的UI,新图标也应替换旧图标。“。也许相同的想法应该用于其他元素!这实际上并没有解决问题-如何将应用程序的默认字体设置为“Helvetica Neue UltraLight”“。目标不是模仿新的动态类型,只是设置一个默认的font.Hmm。我认为它解决了有关使用fontWithName的部分:每次都很乏味且容易出错。您提到了在一个类别中复制一些新方法。这是如何告诉应用程序在整个应用程序中使用给定字体的?将[UIFont fontWithName:@“HelveticaNeue UltraLight”size:size]替换为[UIFont fontForTitles]是一种改进,不是吗?您至少可以通过更改样式类别对样式进行全局更改。
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"