Точный размер CGRect с использованием CGSize sizeWithAttributes

Приведенный ниже код является примером того, как я использую CGRect для рисования текста при создании pdf-документа. Мне нужно рассчитать точный размер CGRect, рисуемого с помощью comment1, чтобы те, что для comment2, comment3 и т. д., начинались в нужном месте. на странице.

Переменная currentLine отслеживает, где на странице находится конец CGRect. Он отлично подходит для коротких комментариев, но не для длинных комментариев, в которых последующие комментарии перекрываются. Шрифт и размер шрифта правильные.

textRect = CGRectMake(60, currentLine, 650, 300);
myString =  self.comments1.text;
[myString drawInRect:textRect withAttributes:_textAttributesNotBold ];

CGSize contentSize = [myString sizeWithAttributes: @{NSFontAttributeName: [UIFont fontWithName:@"Arial" size:12]}];
currentLine =  currentLine +  contentSize.height;

Интересно, проблема в том, что CGRectMake использует ширину 650? Похоже, это не учтено в CGSize.... sizeWithAttributes. Какую ширину принимает CGSize .... sizeWithAttributes при расчете contentSize.height?

Или есть лучший способ сделать это?


person RGriffiths    schedule 01.03.2015    source источник
comment
Я думаю, вы делаете это в обратном порядке... почему бы вам сначала не вычислить размер содержимого... затем создать прямоугольник с этим размером... затем нарисовать строку в этом прямоугольнике? И потом... почему вы не передаете те же аргументы для withAttributes: методу вычисления размера, что и методу фактического рисования?   -  person nhgrif    schedule 01.03.2015
comment
Это логично, но проблема все та же. contentSize.height вычисляется из sizeWithAttributes:, но не учитывает ширину CGRectMake. Я не понимаю, как он вычисляет высоту, не зная ширины кадра.   -  person RGriffiths    schedule 01.03.2015
comment
возможный дубликат iOS 7 sizeWithAttributes: замена sizeWithFont:constrainedToSize   -  person nhgrif    schedule 01.03.2015
comment
@nhgrif Полезно - спасибо. Кажется, я пришел к решению (добавлено здесь), но мне это кажется немного запутанным. Хотя работает.   -  person RGriffiths    schedule 01.03.2015


Ответы (1)


Я не уверен, что это хороший способ сделать это, но, похоже, он работает:

NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"Arial" size:12]};
CGRect rect = [comment1.text boundingRectWithSize:CGSizeMake(650, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil];

CGRect textRect = CGRectMake(60, currentLine, 650, rect.size.height);
[comment1.text drawInRect:textRect withAttributes:attributes ];
currentLine =  currentLine +  rect.size.height;
person RGriffiths    schedule 01.03.2015
comment
Вы должны использовать переменную attributes в обоих местах, где запрашиваются текстовые атрибуты. И последняя строка может быть просто: currentLine += rect.size.height; - person nhgrif; 01.03.2015