许多我以前用于确定打印字符串布局以创建复杂的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 步。
根据 T 先生建议的 lineHeight 属性,我在类别中制作了这些方法,大大简化了我的替换过程。
#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