Согласно документам, CTFramesetterSuggestFrameSizeWithConstraints ()
"определяет формат кадра, необходимый для строкового диапазона".
К сожалению, размер, возвращенный этой функцией, никогда не точен. Вот то, что я делаю:
NSAttributedString *string = [[[NSAttributedString alloc] initWithString:@"lorem ipsum" attributes:nil] autorelease];
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef) string);
CGSize textSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0,0), NULL, CGSizeMake(rect.size.width, CGFLOAT_MAX), NULL);
Возвращенному размеру всегда вычисляли корректную ширину, однако высота всегда немного короче, чем, что ожидается.
Действительно ли это - корректный способ использовать этот метод?
Там какой-либо другой путь к тексту Ядра расположения?
Кажется, что я не единственный для столкновения с проблемами с этим методом. См. https://devforums.apple.com/message/181450.
Править: Я измерил ту же строку с Кварцевым использованием sizeWithFont:
, предоставление того же шрифта и к приписанной строке, и к Кварцу. Вот измерения, которые я получил:
Базовый текст: 133.569336 x 16.592285
Кварц: 135.000000 x 31.000000
Для однострочного кадра попробуйте следующее:
line = CTLineCreateWithAttributedString((CFAttributedStringRef) string);
CGFloat ascent;
CGFloat descent;
CGFloat width = CTLineGetTypographicBounds(line, &ascent, &descent, NULL);
CGFloat height = ascent+descent;
CGSize textSize = CGSizeMake(width,height);
Для многострочного кадра вам также необходимо добавить начало строки (см. Пример кода в Руководство по программированию Core Text )
По какой-то причине CTFramesetterSuggestFrameSizeWithConstraints ()
использует разницу в подъеме и спуске для расчета высоты:
CGFloat wrongHeight = ascent-descent;
CGSize textSize = CGSizeMake(width, wrongHeight);
Это может быть ошибка?
У меня другие проблемы с шириной рамки; Стоит проверить, так как это видно только в особых случаях. См. этот вопрос для получения дополнительной информации.