尝试更改NSStringDrawingUsesFontLeading
为NSStringDrawingUsesLineFragmentOrigin
.
如果您只支持 iOS 6 和 iOS 7,那么我肯定会将您的所有 NSString 更改sizeWithFont:...
为 NSAttributeString boundingRectWithSize
。从 iOS 6 开始,引入了 NSAttributedString 的 NSStringDrawing 函数,它们是线程安全的,与我们习惯使用的旧 NSString+UIKit 方法(例如sizeWithFont:...
,等等)不同,它们是 UIStringDrawing 函数(当你从非-主线程。如果你碰巧有一个奇怪的多线程角落案例,它会为你省去很多麻烦!这是我转换 NSString 的方法sizeWithFont:constrainedToSize:
:
曾经是什么:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font
constrainedToSize:(CGSize){width, CGFLOAT_MAX}];
可以替换为:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
[[NSAttributedString alloc]
initWithString:text
attributes:@
{
NSFontAttributeName: font
}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;
请注意文档中提到:
在 iOS 7 及更高版本中,此方法返回小数大小(在返回的 CGRect 的大小组件中);要使用返回的大小来调整视图大小,您必须使用 ceil 函数将其值提高到最接近的更高整数。
因此,要提取用于调整视图大小的计算高度或宽度,我会使用:
CGFloat height = ceilf(size.height);
CGFloat width = ceilf(size.width);