我用来确定打印字符串布局以创建复杂 pdf 文档的许多方法在 iOS7 中已被弃用。文档调用了相同的方法来替换所有已弃用的 sizeWithFont 方法:
boundingRectWithSize:options:attributes:
这很好,sizeWithFont:ConstrainedTosize:lineBreakMode
但如果我只希望我的字符串在一行上怎么办?我不知道最大高度使用什么,所以我没有一个矩形作为第一个参数的值。
这是我限制给定大小时所拥有的。
CGFloat maxHeightAllowable = _maxHeight;
CGSize issueTitleMaxSize = CGSizeMake(_issueListTitleColWidth - (kColumnMargin *2), maxHeightAllowable);
NSDictionary *issueTitleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:_bodyFont, NSFontAttributeName, nil];
CGRect issueTitleRect = CGRectIntegral([issueTitleText boundingRectWithSize:issueTitleMaxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:issueTitleAttributes context:nil]);
CGSize issueTitleSize = issueTitleRect.size;
如果我不知道 maxHeight,或者实际上,一条线的高度正是我想要找出的,我将如何使用相同的方法?
我明白他们为什么要推动 NSAttributed 字符串和自动布局的兼容性,但为什么要弃用这些?就我而言,替换现在需要 4 或 5 个步骤,而以前是 1 或 2 个步骤。
使用字体的 lineHeight 属性,正如 T 先生所建议的那样,我将这些方法放在一个类别中,大大简化了我的替换。
#import "NSString+SizingForPDF.h"
@implementation NSString (SizingForPDF)
-(CGSize)integralSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)maxSize
{
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
CGRect rect = CGRectIntegral([self boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil]);
return rect.size;
}
-(CGSize)integralSizeWithFont:(UIFont *)font maxWidth:(CGFloat)maxWidth numberOfLines:(NSInteger)lines
{
if (lines == 0) {
lines = 1;
}
NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
CGFloat height = font.lineHeight * lines;
CGSize maxsize = CGSizeMake(maxWidth, height);
CGRect rect = CGRectIntegral([self boundingRectWithSize:maxsize options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesFontLeading attributes:attributes context:nil]);
return rect.size;
}
@end