Aus*_*ick 8 fonts objective-c ios ios7 textkit
我有一个NSAttributedString报告一个boundingRectWithSize(和扩展名为UITextView,它不正确地计算其sizeThatFits)当字体大小从用于创建它的字体大小减少时.
在我执行类似操作的所有NSAttributedStrings上都不会发生这种情况,因此这里是重现的步骤.
从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];
Run Code Online (Sandbox Code Playgroud)
我注意到,在while循环中运行此代码时,检查sizeThatFits以了解文本何时足够小以适应,我会在某些情况下发生竞争.对于任何小于我开始时的字体值,高度计算为60px,恰好是50px.
在NSLog使用NSAttributedString时,我发现有几个属性我没有使用该键添加,而这些属性NSOriginalFont似乎不在此处支持的属性列表中.NSOriginalFont发生了什么?为什么我的尺寸计算不正确?
Aus*_*ick 13
我最终解决了这个问题,但发现网上缺乏关于它的信息,所以我决定在这里记录我的解决方案.
NSOriginalFont当使用的字体不支持字符串中的一个或多个字符时,将创建属性.NSAttributedString添加了这些属性,这些属性跟踪在替换为Helvetica之前"假定"的字体.我可以编写一个有用的情况(你有时会运行大写字符串的全部字体:on?)但它对我没用.
事实上它是有害的.当我迭代我的字体相关属性以减小如上所示的大小时,文本的可见大小正在减小,但NSOriginalFont属性保留了对大尺寸的引用.
NSOriginalFont没有内置常量,但如果按名称调用它,则可以从NSMutableAttributedString中删除它.如果你这样做,你将开始从sizeThatFits,boundingRectWithSize和其他类似的函数得到正确的结果,假设你传递了正确的选项.
我最终在NSMutableAttributedString上创建了一个简单的类别方法,包含在下面,效果很好.
NSMutableAttributedString + StripOriginalFont.h
@interface NSMutableAttributedString (StripOriginalFont)
- (void) stripOriginalFont;
@end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
大概你可以简单地修改它以保持它"同步"而不是完全删除它,但它对我这个特定的项目没有用.
| 归档时间: |
|
| 查看次数: |
4004 次 |
| 最近记录: |