-fontWithSize返回不同​​的字体对象

dji*_*i33 6 fonts objective-c nsattributedstring uifont ios

更新1

我找到了解决办法:

// instead of
font = [font fontWithSize:pointSize];

// i can do this and get the correct font back
font = [UIFont fontWithName:font.fontName size:pointSize]
Run Code Online (Sandbox Code Playgroud)

我正在使用Nick Lockwood的HTMLLabel类将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;
}
Run Code Online (Sandbox Code Playgroud)

这种方法被多次调用.在第一次迭代期间,如果我设置断点Code Path 1并记录font,我得到的是我期待的:

<UICTFont: 0x7fd41bc8f2b0> font-family: "Fort-Book"; font-weight: bold; font-style: normal; font-size: 18.00pt
Run Code Online (Sandbox Code Playgroud)

但是,如果我font之后退出Code Path 2,我会得到这个:

<UICTFont: 0x7fd41bd709a0> font-family: "Fort"; font-weight: bold; font-style: normal; font-size: 18.00pt
Run Code Online (Sandbox Code Playgroud)

不知何故,通过调用-fontWithSize:,我的字体变为Fort-Book常规Fort.

文件fontWithSize明确说明:

返回与接收器相同但具有指定大小的字体对象.

为什么我要找回另一个字体对象?

dji*_*i33 4

事实证明这是 iOS 8.3(可能更早)中的一个错误。

我提交了雷达(#21540510)。

您可以在这里亲自查看: https: //github.com/djibouti33/UIFontBug

同时,如果您在使用时遇到问题-fontWithSize,请改用+fontWithName:size: