【发布时间】:2015-09-03 13:12:47
【问题描述】:
我发现使用NSFontAttributeName : [UIFont preferredFontForTextStyle:UIFontTextStyleBody] 调用时,调用boundingRectWithSize 是非常不正确的,缺少一整行。但是,使用[UIFont fontWithName:@"Helvetica Neue" size:17.f] 字体就可以了。
这是显示错误的测试代码:
- (void)viewDidLoad {
[super viewDidLoad];
NSString *measureText = @"I'm the king of Portmanteaus ... My students slow clap";
CGSize maxSize = CGSizeMake(226.f, CGFLOAT_MAX);
UIFont *targetFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
CGRect stringRect = [measureText boundingRectWithSize:maxSize
options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
attributes:@{ NSFontAttributeName : targetFont }
context:nil];
UILabel *drawLabel = [[UILabel alloc] initWithFrame:stringRect];
drawLabel.font = targetFont;
[self.view addSubview:drawLabel];
drawLabel.textColor = [UIColor blackColor];
drawLabel.text = measureText;
drawLabel.numberOfLines = 0;
}
还有输出:
但是,如果我让targetFont = [UIFont fontWithName:@"Helvetica Neue" size:17.f];
正确渲染:
在第一种情况下,大小为 {226.20200000000008, 42.281000000000006},但在正确的第二种情况下,大小为 {228.64999999999998, 60.366999999999997}。因此,这不是一个四舍五入的问题;这是缺少一个全新的行。
将[UIFont preferredFontForTextStyle:UIFontTextStyleBody] 作为参数传递给boundingRectWithSize 是错误的吗?
编辑
根据下面答案中的 cmets,我认为 iOS 如何处理与后续单词相关的三个句点存在错误。我已添加此代码:
measureText = [measureText stringByReplacingOccurrencesOfString:@" ..." withString:@"…"];
它可以正常工作。
【问题讨论】:
标签: ios8 nsstring uilabel uifont