【发布时间】:2014-05-14 15:36:57
【问题描述】:
当字体大小从用于创建它的字体大小减小时,我有一个 NSAttributedString 报告 boundingRectWithSize(以及扩展的 UITextView,它不正确地计算其 sizeThatFits)。
它不会发生在我执行类似操作的所有 NSAttributedStrings 上,所以这里是重现的步骤。
- 使用不包含完整 unicode 字符集的非标准字体。
- 确保字符串包含此“不受支持”集中的字符。 iOS 会将它们呈现为适当大小的 Helvetica。
- 在 NSAttributedString 中的所有字体属性上缩小字体。我这样做的代码产生了这个问题,如下所示。
从 UITextView 子类内部:
NSMutableAttributedString *mutableString = [self.attributedText mutableCopy];
[mutableString enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, mutableString.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {
if (value) {
UIFont *oldFont = (UIFont *)value;
UIFont *newFont = [oldFont fontWithSize:oldFont.pointSize - 1];
[mutableString removeAttribute:NSFontAttributeName range:range];
[mutableString addAttribute:NSFontAttributeName value:newFont range:range];
}
}];
self.attributedText = [mutableString copy];
我注意到,在while 循环中运行此代码时,会检查 sizeThatFits 以了解文本何时足够小以适合在某些情况下我会发生零竞赛。对于任何小于我开始时的字体值(恰好是 50 像素),高度都被计算为 60 像素。
当NSLog NSAttributedString 时,我发现有几个属性我没有使用键NSOriginalFont 添加,它似乎不在支持的属性列表here 中。 NSOriginalFont 是怎么回事?为什么我的尺寸计算不正确?
【问题讨论】:
-
对于遇到此问题的其他人,可以创建此属性的另一种方法是,如果您已从
UITextView读取属性字符串,在某些情况下可能会插入该属性。
标签: ios objective-c ios7 fonts textkit