在iOS中检测浅色字体

在iOS中检测浅色字体,ios,fonts,light,font-family,Ios,Fonts,Light,Font Family,我试图在我的iOS应用程序中指定每个标签的字体系列,这样以后就可以很容易地更改它们。我不想通过界面构建器在每个屏幕上重置每个字体。根据,我创建了一个方法,可以在视图中查找所有字体并进行相应设置 在我的例子中,根据字体是粗体、斜体还是浅色(例如,紧身),我需要使用几个不同的字体系列。这些文件都位于单独的文件中,如“OpenSans Semibold.ttf”、“OpenSans Italic.ttf”和“OpenSans Light.ttf” 理想情况下,我希望能够在Interface Build

我试图在我的iOS应用程序中指定每个标签的字体系列,这样以后就可以很容易地更改它们。我不想通过界面构建器在每个屏幕上重置每个字体。根据,我创建了一个方法,可以在视图中查找所有字体并进行相应设置

在我的例子中,根据字体是粗体、斜体还是浅色(例如,紧身),我需要使用几个不同的字体系列。这些文件都位于单独的文件中,如“OpenSans Semibold.ttf”、“OpenSans Italic.ttf”和“OpenSans Light.ttf”

理想情况下,我希望能够在Interface Builder中将字体设置为粗体、斜体或浅色,然后使用适当的.ttf文件让代码仅覆盖字体系列。根据,我可以很容易地检测出字体是否被设置为粗体或斜体,但找出它是否是轻的似乎不起作用

对于浅色字体,“traits”的值为0x0——因此不设置任何标志。有没有其他方法可以检测浅色字体

代码如下所示:

- (void) setFontFamily:(UIView*)view
{
    if([view isKindOfClass:[UILabel class]])
    {
        UILabel* label = (UILabel*)view;

        UIFontDescriptorSymbolicTraits traits = label.font.fontDescriptor.symbolicTraits;
        BOOL bold = traits & UIFontDescriptorTraitBold;
        BOOL italic = traits & UIFontDescriptorTraitItalic;

        if(bold)
            [label setFont:[UIFont fontWithName:@"OpenSans-Semibold"size:label.font.pointSize]];
        else if(italic)
            [label setFont:[UIFont fontWithName:@"OpenSans-Italic"size:label.font.pointSize]];
        else if(light)
            [label setFont:[UIFont fontWithName:@"OpenSans-Light"size:label.font.pointSize]];
        else
            [label setFont:[UIFont fontWithName:@"OpenSans"size:label.font.pointSize]];
    }

    for(UIView* subView in view.subviews)
        [self setFontFamily:subView];
}

根据字体特征确定字体的整个方法都存在问题:

else if(italic)
    [label setFont:
        [UIFont fontWithName:@"OpenSans-Italic"size:label.font.pointSize]];
您正在根据特征对字体名称进行硬编码。相反,根据名称和特征向运行库请求字体。在这个非常简单的示例中,我发现安装的字体(如果有的话)是Gill Sans的斜体变体:

UIFont* f = [UIFont fontWithName:@"GillSans" size:15];
CTFontRef font2 =
    CTFontCreateCopyWithSymbolicTraits (
        (__bridge CTFontRef)f, 0, nil, 
         kCTFontItalicTrait, kCTFontItalicTrait);
UIFont* f2 = CFBridgingRelease(font2);
请注意,此代码仅在iOS 7中有效,其中CTFontRef和UIFont是相互免费桥接的。从理论上讲,通过UIFontDescriptor在没有C函数的情况下应该可以做到这一点,但我上次查看时发现它有问题,并且不适用于所有字体(例如Gill Sans!)


这就是您应该做的:确定起始字体的符号和重量特征,然后向运行时询问最符合您要求的字体。

是否可能您误解了“轻”是什么?斜体和粗体是象征性特征。“轻”是一种体重特征。您的代码中没有与重量有关的内容。哦,对不起,还有一件事:在iOS 7上,您知道UIFontDescriptor吗?你可能会发现它更容易使用。很可能我误解了光的技术定义。但大胆不是一种体重特征吗?光本质上是相反方向的同一事物。无论如何,我在API中没有看到任何与字体重量相关的内容(例如,没有CTFontWeightTraits)。有这样的事情吗?关于使用UIFontDescriptor的好建议,我修改了代码以反映这一点。“例如,没有CTFontWeightTraits”那么什么是
kCTFontWeightTrait
?您是否花时间查看了文档中的常量部分?