CTFramesetterSuggestFrameSizeWithConstraints базового текста () возвращает неправильный размер каждый раз

Согласно документам, 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

8
задан Cœur 15 April 2018 в 14:41
поделиться

1 ответ

Для однострочного кадра попробуйте следующее:

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);

Это может быть ошибка?

У меня другие проблемы с шириной рамки; Стоит проверить, так как это видно только в особых случаях. См. этот вопрос для получения дополнительной информации.

5
ответ дан 5 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: