我试图在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];
}
答案 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!)。
这就是你应该做的:确定你的起始字体的符号和重量特征,然后向运行时询问最接近你的要求的字体。