我最终解决了这个问题,但发现网上缺乏有关它的信息,所以我决定在这里记录我的解决方案。
NSOriginalFont
当使用的字体不支持字符串中的一个或多个字符时,将创建属性。 NSAttributedString 添加这些属性来跟踪字体在替换为 Helvetica 之前“应该”是什么。我可以编造一个有用的情况(有时会运行 uppercaseString: 的全大写字体?),但它对我来说没有用。
事实上它是有害的。当我迭代字体相关属性以减小尺寸(如上所示)时,文本的可见尺寸正在减小,但 NSOriginalFont 属性保留了对大尺寸的引用。
NSOriginalFont 没有内置常量,但如果您通过名称调用它,则可以将其从 NSMutableAttributedString 中删除。如果这样做,假设您传递了正确的选项,您将开始从 sizeThatFits、boundingRectWithSize 和其他类似函数获得正确的结果。
我最终在 NSMutableAttributedString 上创建了一个简单的类别方法,如下所示,效果很好。
NSMutableAttributedString+StripOriginalFont.h
@interface NSMutableAttributedString (StripOriginalFont)
- (void) stripOriginalFont;
@end
NSMutableAttributedString+StripOriginalFont.m
@implementation NSMutableAttributedString (StripOriginalFont)
- (void) stripOriginalFont{
[self enumerateAttribute:@"NSOriginalFont" inRange:NSMakeRange(0, self.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {
if (value){
[self removeAttribute:@"NSOriginalFont" range:range];
}
}];
}
@end
想必您可以简单地修改它以使其保持“同步”,而不是完全删除它,但它对我这个特定项目没有用处。