在iOS中检测轻字体

时间:2014-03-27 21:34:29

标签: ios fonts light font-family

我试图在iOS应用程序中指定每个标签的字体系列,以便以后更容易更改它们。我不想通过Interface Builder并重置每个屏幕上的每个字体。根据{{​​3}},我创建了一个方法,可以在视图中找到所有字体并相应地设置它们。

在我的情况下,根据字体是粗体,斜体还是浅色(例如瘦),我需要使用一些不同的字体系列。这些都位于单独的文件中,例如“OpenSans-Semibold.ttf”,“OpenSans-Italic.ttf”和“OpenSans-Light.ttf”。

理想情况下,我希望能够在Interface Builder中将字体设置为粗体,斜体或浅色,然后使用相应的.ttf文件使代码覆盖字体系列。根据{{​​3}},我可以非常轻松地检测字体是否设置为粗体或斜体,但是发现它是否轻便似乎不起作用。

对于浅色字体,“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];
}

1 个答案:

答案 0 :(得分:1)

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

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是免费桥接的。理论上应该可以在没有C函数的情况下通过UIFontDescriptor执行此操作,但是我最后一次看它是有缺陷的,并没有适用于所有字体(例如Gill Sans!)。

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