-fontWithSize 返回不同的字体对象
-fontWithSize returning different font object
更新 1
我找到了解决方法:
// instead of
font = [font fontWithSize:pointSize];
// i can do this and get the correct font back
font = [UIFont fontWithName:font.fontName size:pointSize]
我正在使用 Nick Lockwood's HTMLLabel class 将 HTML 转换为尊重 HTML 中样式的 NSAttributedString。在大多数情况下,效果很好。
但是,我在我的应用程序中使用了自定义字体,出于某种原因,我的字体总是以粗体显示。我使用系统字体没有这个问题。我已将其缩小为这种方法:
- (UIFont *)font
{
// ** Code Path 1 **
UIFont *font = _styles[HTMLFont];
if ([font isKindOfClass:[NSString class]])
{
font = [UIFont fontWithName:(NSString *)font size:17.0f];
}
NSInteger pointSize = [_styles[HTMLTextSize] floatValue] ?: font.pointSize;
if (self.bold) {
if (self.italic)
{
font = [font boldItalicFontOfSize:pointSize];
}
else
{
font = [font boldFontOfSize:pointSize];
}
} else if (self.italic) {
font = [font italicFontOfSize:pointSize];
} else {
// ** Code Path 2 **
font = [font fontWithSize:pointSize];
}
return font;
}
这个方法被调用了很多次。在第一次迭代期间,如果我在 Code Path 1
处设置断点并记录 font
,我会得到我期望的结果:
<UICTFont: 0x7fd41bc8f2b0> font-family: "Fort-Book"; font-weight: bold; font-style: normal; font-size: 18.00pt
但是,如果我在 Code Path 2
之后注销 font
,我会得到:
<UICTFont: 0x7fd41bd709a0> font-family: "Fort"; font-weight: bold; font-style: normal; font-size: 18.00pt
不知何故,通过调用 -fontWithSize:
,我的字体从 Fort-Book
更改为常规 Fort
。
fontWithSize
的文档明确指出:
Returns a font object that is the same as the receiver but which has the specified size instead.
为什么我会取回不同的字体对象?
原来这是 iOS 8.3(可能更早)中的错误。
我提交了雷达 (#21540510)。
你可以在这里自己看看:
https://github.com/djibouti33/UIFontBug
同时,如果您在使用 -fontWithSize
时遇到问题,请改用 +fontWithName:size:
。
更新 1
我找到了解决方法:
// instead of
font = [font fontWithSize:pointSize];
// i can do this and get the correct font back
font = [UIFont fontWithName:font.fontName size:pointSize]
我正在使用 Nick Lockwood's HTMLLabel class 将 HTML 转换为尊重 HTML 中样式的 NSAttributedString。在大多数情况下,效果很好。
但是,我在我的应用程序中使用了自定义字体,出于某种原因,我的字体总是以粗体显示。我使用系统字体没有这个问题。我已将其缩小为这种方法:
- (UIFont *)font
{
// ** Code Path 1 **
UIFont *font = _styles[HTMLFont];
if ([font isKindOfClass:[NSString class]])
{
font = [UIFont fontWithName:(NSString *)font size:17.0f];
}
NSInteger pointSize = [_styles[HTMLTextSize] floatValue] ?: font.pointSize;
if (self.bold) {
if (self.italic)
{
font = [font boldItalicFontOfSize:pointSize];
}
else
{
font = [font boldFontOfSize:pointSize];
}
} else if (self.italic) {
font = [font italicFontOfSize:pointSize];
} else {
// ** Code Path 2 **
font = [font fontWithSize:pointSize];
}
return font;
}
这个方法被调用了很多次。在第一次迭代期间,如果我在 Code Path 1
处设置断点并记录 font
,我会得到我期望的结果:
<UICTFont: 0x7fd41bc8f2b0> font-family: "Fort-Book"; font-weight: bold; font-style: normal; font-size: 18.00pt
但是,如果我在 Code Path 2
之后注销 font
,我会得到:
<UICTFont: 0x7fd41bd709a0> font-family: "Fort"; font-weight: bold; font-style: normal; font-size: 18.00pt
不知何故,通过调用 -fontWithSize:
,我的字体从 Fort-Book
更改为常规 Fort
。
fontWithSize
的文档明确指出:
Returns a font object that is the same as the receiver but which has the specified size instead.
为什么我会取回不同的字体对象?
原来这是 iOS 8.3(可能更早)中的错误。
我提交了雷达 (#21540510)。
你可以在这里自己看看: https://github.com/djibouti33/UIFontBug
同时,如果您在使用 -fontWithSize
时遇到问题,请改用 +fontWithName:size:
。