【发布时间】: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