2013-03-10 1 views
6

Речь идет о форматировании PDF с использованием основной графики. Но это может быть о любом типе подкачки, когда дело доходит до печати строки на двух страницах.Как определить, какая часть nsstring вписывается в прямоугольник?

Мне нужно разложить строку на несколько страниц. Для небольших строк это не проблема. Для них я использую расширения NIString UIKit sizeWithFont, чтобы определить, подходит ли полный текст на текущей странице или нет. Если это так, то я печатаю его с drawInRect, а если нет, то переместите его на следующую страницу.

Работает отлично, но не подходит для длинных строк. В моем приложении отдельные строки (предоставленные пользователем) могут даже быть длиннее полной страницы.

Когда есть полная страница или какое-либо оставшееся пространство указанной страницы, как я могу точно определить, какую часть NSString можно отобразить в указанном прямоугольнике, чтобы я мог отключить ее и распечатать оставшуюся строку (или по крайней мере, часть его) на следующей странице?

Я думал об альтернативе. Это приводит полный текст в контекст графического экрана, а затем разрезает созданное изображение на фрагменты, которые вписываются в свободное пространство на страницах. Но если я это сделаю, мне нужно разместить линию разреза точно между текстовыми строками. И, честно говоря, я не уверен, как определить, где текст, содержащий графику, можно безопасно разрезать на две (или более) части, не срезая линию текста в ее середине.

Надеюсь, я выразил себя понятным и что кто-то приходит на помощь.

+1

+1, наконец, кто-то четко формулирует эту путаницу. – CodaFi

+0

Я сомневаюсь, что вы действительно хотите сделать это, используя свою альтернативу ... Если это было о растровом изображении, хорошо, но вы, конечно же, не хотите, чтобы ваш текст был включен в ваш PDF в виде растрового изображения ... – mkl

+0

@mkl, вы правы. Вот почему я спрашиваю. Тем не менее, в конце мне нужен pdf, который отлично отпечатывается на бумаге. Есть идеи? –

ответ

2

В основной текст, есть a very relevant function, чей последний аргумент (указатель на CFRange) определяется следующим образом:

fitRange
В свою очередь, содержит диапазон строки, на самом деле вписываются в ограниченный размер.
+0

Извинения за поздний ответ. Я должен был отложить этот проект сразу после того, как задал этот вопрос из-за приоритетов. Теперь, когда я продолжаю работать, я обнаружил, что ваше предложение, или связанное, работает совершенно правильно. Спасибо за подсказку. –

+0

Привет, Герман. Я тоже сталкиваюсь с той же проблемой. Но я создаю PDF-файл, используя методы UIKit, и используя . Привет. В моем приложении мне нужно сгенерировать PDF-файл, получив данные из Array.Pdf поколение выполнено успешно с использованием методов UIKit, таких как drawrect и с помощью UIGraphicsBeginPDFContextToFile (thefilePath, CGRectZero, nil); UIGraphicsBeginPDFPageWithInfo (CGRectMake (0, 0, pageSize.width, pageSize.height). Здесь я не могу определить длину строки, которая может поместиться в любую строку и оставшуюся строку в другой строке на следующей странице. Пожалуйста, объясните как вы использовали диапазон пригодности. – Naresh

+0

@Naresh: Я думаю, вы должны задать новый вопрос, который объясняет, что вы делаете, и проблему, которую вы испытываете более подробно. –

0

Как насчет использования приближения?

- (NSInteger)lengthOfString:(NSString *)str 
      thatFitsIntoView:(UIView *)displayView 
        withFont:(UIFont *)font 
{ 
    CGSize textSize = [str sizeWithFont:font 
           forWidth:displayView.frame.size.width 
          lineBreakMode:NSLineBreakByWordWrapping]; 

    NSInteger lengthThatFits; 
    if (textSize.height > displayView.frame.size.height) { 
     lengthThatFits = str.length * displayView.frame.size.height/textSize.height; 
    } else { 
     lengthThatFits = str.length; 
    } 

    return lengthThatFits; 
} 

Зов это нравится:

NSString *str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eros" 
    "nulla, commodo eget fringilla nec, varius nec ligula. Donec pulvinar eros sed diam" 
    "euismod scelerisque. Mauris imperdiet leo at elit vulputate ullamcorper. Nullam" 
    "condimentum odio a lacus tempus ac pretium justo tincidunt."; 

UIFont *font = [UIFont systemFontOfSize:16.0]; // or whatever 
UIView *displayView = // the view in which you intend to present the string 

NSInteger length = [self lengthOfString:str thatFitsIntoView:displayView usingFont:font]; 
NSString *displayedString = [str substringToIndex:length]; 
+0

Да, если я не нахожу ничего лучше, мне нужно будет приблизиться. Приближение должно было бы учитывать перенос строк/слов. Тогда я мог бы даже «приложить предложение». Значение Я бы отрезал строку только после полных остановок «.», Точки с запятой и т. Д.И затем проверьте часть строки, действительно ли она вписывается в прямоугольник. Но это будет зависеть от пользователя, делающего логический вход. Ваше предложение не сработает, если пользователь введет значительное количество cr/lf. Мне нужно что-то более точное. Некоторый 'numberOfCharsOfString: fitIntoRect: withFont: lineBreakMode:' или так. –

+0

@HermannKlecker Это делает именно это. Возвращает количество символов, которые вписываются. Вы можете точно настроить результат, начав итерацию с 'lengthThatFits' обратно в сторону 0 и протестировать, если подстрока до тех пор, пока этот индекс не подходит. – 2013-03-10 11:34:22

+0

Я ценю вашу помощь. Но я сомневаюсь, что он точно соответствует шляпе. Сначала он определяет высоту текстового блока обычным способом. Затем он проверяет, будет ли текстовый блок помещаться на странице. До сих пор. Но тогда он просто принимает отношение полной высоты текста к размеру свободного места на странице и умножает это отношение на количество символов и возвращаемых результатов. (cont ...) –

2

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

Если вы используете Core Text, просто создайте CTFrame для области, которую хотите заполнить, а затем спросите ее о диапазоне, который он использовал с CTFrameGetVisibleStringRange().

+0

Роб и Питер, я обязательно посмотрю на основной текст. Благодарю. –

Смежные вопросы