Как использовать sizeWithFont и drawInRect для NSString, чтобы выяснить, сколько строк нарисовать - PullRequest
3 голосов
/ 11 февраля 2011

Я рисую несколько «страниц» изображений, используя CGContext в iOS. Я широко использовал комбинации sizeWithFont и drawInRect в своем приложении. Что мне нужно сделать, это разбить большой кусок текста на несколько страниц. Я могу измерить его и определить, нужна ли ему еще одна страница, но как узнать, где ее можно нарезать? Нужно ли делать уродливый цикл, чтобы проверять слово за словом, пока я не найду длину строки, которая идеально соответствует странице, а затем обрежу строку в этой точке? Есть ли более разумный способ?

Есть идеи?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 11 февраля 2011

Добавив NSString к UIKit для рисования текста, вы можете заранее определить точное количество места, необходимое для визуализации данного текста для данного шрифта.Если вы разбиваете текст на страницы, вы можете использовать этот метод.

– sizeWithFont:constrainedToSize:lineBreakMode:

Предполагая, что режим шрифта и разрыва строки известен, создайте размер CGSize, имеющий ту же ширину, что и ваша страница, и используйте достаточное число для высоты,Это будет максимальный размер, на который мы ограничиваем текст.

CGSize maximumSize = CGSizeMake(pageWidth, 999999999);
CGSize expectedSize = [veryLongString sizeWithFont:theFont constrainedToSize:maximumSize lineBreakMode:theLineBreakMode];

expectedSize сообщит нам размер, который будет принимать текст, если он будет расширяться вертикально бесконечно (очень близко к).Чтобы найти необходимое количество страниц, просто разделите общую высоту на высоту одной страницы.

NSInteger totalPages = ceil(expectedSize.height / heightOfOnePage);

Вы также можете настроить высоту одной страницы, чтобы последняя строка текста не изменялась.не обрезается.Чтобы это произошло, высота страницы должна быть кратна высоте строки шрифта.Скажем, начальная высота страницы равна 300px, а высота шрифта равна 16px, тогда будет некоторое ограничение, например 300/16 = 18.75, которое не является целым числом.

NSInteger linesWithoutClipping = floor(initialPageHeight / theFont.lineHeight);
CGFloat optimalPageHeight = linesWithoutClipping * theFont.lineHeight;

Принимая значение пола18 и умножив его на высоту строки шрифта 16, мы получим оптимальную высоту страницы 288, чтобы избежать обрезки.

Обратите внимание, что lineHeight был представлен в iOS 4.0, но вы можете рассчитать егосами, если это необходимо для более старых версий.

2 голосов
/ 16 ноября 2012

Я могу обойти эту проблему, разделив ее на строки.

NSArray * paragraphs = [text componentsSeparatedByString:@"\n"];

Вы все еще должны сделать всю работу, чтобы определить разрывы страниц и тому подобное, но я нашел этот лучший обходной путь до сих пор.

...