【问题标题】:Detecting light fonts in iOS在 iOS 中检测浅色字体
【发布时间】:2014-05-07 03:20:27
【问题描述】:

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

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

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

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

【问题讨论】:

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

标签: ios fonts light font-family


【解决方案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 彼此免费桥接。 理论上,应该可以通过 UIFontDescriptor 不使用 C 函数来执行此操作,但是我上次看时它有问题,并且不适用于所有字体(例如 Gill Sans!)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多