Многие методы, которые я использовал для определения макета печатных строк для создания сложных PDF-документов, были устаревшими в iOS7. Документация взывает тот же метод, чтобы использовать в качестве замены для всех методов sizeWithFont, которые устаревшее:Замена для sizeWithFont: ForWidth: lineBreakMode:
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.
Используя свойство fontHeight шрифта, как предложил г-н Т., я сделал эти методы в категории, которая значительно упрощает мои замена.
#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
Ваш метод почти так же, как у меня, только я использую макрос CGRectIntegral зажать значения для целых чисел. Я никогда не думал о шрифте для высоты линии. Это был ответ для меня. Я использовал его для создания нескольких новых методов в категории, которые легче заменяют мой прежний код. –
LineBreakMode заменяется атрибутом NSParagraphStyle, который можно добавить в словарь атрибутов. См. Http://stackoverflow.com/a/26894770/338468 для подробного примера того, как это сделать. –