2014-02-08 3 views
9

Я хочу загрузить длинный текст в TextViews разных представлений. Текст должен быть разделен на страницы, когда он достигнет конца текстовых просмотров. Следующий текст должен начинаться с продолжения текста.Как ограничить содержимое в UITextView в ios

У меня много ответов. Но все указывает на ограничение текстового содержимого при вводе данных. Я хочу отображать выгружаемые данные в TextView. И там не будет ввода или редактирования в нем. Поэтому методы делегата в отношении этого не будут работать.

Я попытался загрузить текст фиксированной длины. но это неверно, если абзацы абзацев различны.

Так что я пытаюсь найти это, получаю уведомление, когда текст достигает конца емкости текстового поля или получает возможность текстового просмотра без символов/символов. Есть какой-либо способ сделать это ???

Update

Согласно комментариям я получил, я искал много и достиг в NSTextStorage, NSTextLayoutManager и NSTextContainer

Я нашел эту ссылку, которая поможет легко осуществить PAGINATION

http://sketchytech.blogspot.co.uk/2013/11/paging-and-paginating-easy-way-with.html

В этом примере они создали 4 объекта, используя цикл. Можно сказать, что они разделили строку на 4 части и отобразились в 4 uitextviews scrollview.

Я пытаюсь установить условие для разделения на textcontainers в соответствии с длиной строки. Я пытаюсь создать условие, рассматривая общую длину основной строки & текст, отображаемый в текстовых изображениях.

enter image description here

Но каждый TextView»длина текста совпадает с общей длиной основной строки. Так как я мог получить текст длины, отображаемый в каждом текстовом контейнере textview ????

+1

Я думаю, что вам лучше всего не будет идти на 'length' текста, а с помощью' height'. Вы можете получить эту характеристику из атрибутов [[NSString sizeWithAttributes: (NSDictionary *)] ' –

+0

Исходя из вашей проблемы, вам, вероятно, придется использовать' sizeWithAttributes', а также специальный инструмент «chunkenizing», бинарный поиск pbb, где обрезать строку. –

+1

Я не уверен в этом, но не должен ли contentSize textView быть допустимым значением для рассмотрения при переходе к следующему textView? Я думаю, что действие 'paste' может вызвать проблемы с этим. – n00bProgrammer

ответ

0

Вариант 2 работает в iOS с соответствующими параметрами.

NSAttributedString *attrStr = ... // your attributed string 
CGFloat width = 300; // whatever your desired width is 
CGRect rect = [attrStr boundingRectWithSize:CGSizeMake(width, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil]; 

Без правильных значений параметра параметров вы получите неправильную высоту.

получил этот ответ от here

+1

Позвольте мне проверить. , , , –

+1

Это действительно работает !!!! Я получил CGRect, необходимый для nsattributedstring, который у меня был. Затем, используя это, я создал условие, сравнив его с моим размером текстового вида. , , , Спасибо Kuriakose & rmaddy –

+1

@KaranAlangat может сказать, какое состояние у вас использовано? или дать мне мою идею. Thanx – Kalpesh

-1

Используйте следующий метод:

NSString *textEntered = [[[tvQuestion.text copy] autorelease] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

     //Added for 450 character restriction 
     if([textEntered length] > 450) { 
      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message" message:kMoreThan450CharactersForQuestion delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES]; 
      [alertView release]; 
     } 
+1

может у, пожалуйста, объясните это просто ?? я не могу найти никакой идеи для применения в моем проекте. –

+0

Вы хотите проверить это событие какого-либо события нажатием кнопки, или вы хотите показывать предупреждающее сообщение во время ввода текста в текстовом виде? –

+1

Я просто показываю текст. .. textview не редактируется –

0

Как о присвоении полного текста все представления текста. Затем, когда мы переходим от текстового текста к другому тексту, мы просто используем нижеследующую функцию текстового вида.

- (void)scrollRangeToVisible:(NSRange)range; 

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

+1

привет, так как я могу установить диапазон. Я хочу textview полный текст. когда я устанавливаю диапазон вручную, он изменяется, когда абзацы абзаца изменяются. У вас есть идея получить длину видимого текста в textview? SO i можно установить диапазон, измеряя это. , , , –

+0

@KaranAlangat Я бы сказал, что пробная версия и ошибка должны дать вам оптимальный диапазон. Потому что это легко и быстро, пока вы не получите хороший ответ. Один из недостатков моего подхода заключается в том, что если есть абзац, заканчивающийся или начинающийся в этом диапазоне, может быть какое-то пустое место слева или сверху. Только вы были бы лучшим судьей, как он выглядит, когда вы его применяете. – Rajesh

2

Мне пришлось делать измерения текста в UITextView некоторое время назад для наложения представлений поверх некоторых слов в UITextView на iOS 5. С изменениями UITextView для iOS 7 мне больше не нужно это делать. То, как я делал измерения, может быть тем, что вам нужно, чтобы разбить текст. У меня нет хорошего рабочего кода, поэтому я должен буду описать алгоритм, насколько я его помню.

Этот алгоритм не работает, когда существуют переменные высоты линии.

  1. я нашел метод проб ошибок, что текст ширину мне нужно, чтобы соответствовать против была ширина зрения текста минус 16.
  2. ли бинарный поиск по подстрокам текста, чтобы найти максимальную подстроку, которая соответствует в UITexView, где подстрока разбивается на границы слов. Вы можете использовать NSLinguistic tagger для получения границ слов.
  3. На каждом вызове подстроки [substr sizeWithFont:font constrainedToSize:sizeConstraint lineBreakMode:NSLineBreakByWordWrapping], где ограничения по размеру в ширину от шага 1 и очень большая высота.
  4. Вам необходимо продолжить поиск, пока не сможете определить границу слова, где размер с ограничениями для word1 дает вам высоту, которая соответствует вашему взгляду, и сразу следующее слово дает вам высоту, которая не соответствует вашему представлению. Вы узнаете, что именно здесь UITextView сделает перенос слов, который будет слишком большим, чтобы соответствовать одной из ваших страниц.
  5. Разделите текст на границе слова с шага 4 и выполните то же самое для следующей страницы.
+0

Спасибо за ответ. .. –

0

Я сделал что-то подобное, используя библиотеку DTCoreText.

DTCoreText включает в себя макеты помощников с ними, было легко разрезать текст в столбцах и создать различные текстовые изображения. Я создал пример на GitHub, показывающий, как можно сделать:

https://github.com/brovador/DTCoreTextColumnsExample

Надеется, что это помогает

1

Вот два элемент:

Хорошее объяснению/образец для мульти колонки с прошивкой 7 текста комплект :

https://github.com/ShinobiControls/iOS7-day-by-day/blob/master/21-multi-column-textkit/21-multi-column-textkit.md

на основе этой выборки и следующий вопрос:

How do I locate the CGRect for a substring of text in a UILabel?

Вы можете попробовать что-то вроде этого:

- (void)layoutTextContainers 
{ 
    NSUInteger lastRenderedGlyph = 0; 
    CGFloat currentXOffset = 0; 
    while (lastRenderedGlyph < _layoutManager.numberOfGlyphs) { 
     CGRect textViewFrame = CGRectMake(currentXOffset, 10, 
              CGRectGetWidth(self.view.bounds)/2, 
              CGRectGetHeight(self.view.bounds) - 20); 
     CGSize columnSize = CGSizeMake(CGRectGetWidth(textViewFrame) - 20, 
             CGRectGetHeight(textViewFrame) - 10); 

     NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:columnSize]; 
     [_layoutManager addTextContainer:textContainer]; 

     // And a text view to render it 
     UITextView *textView = [[UITextView alloc] initWithFrame:textViewFrame 
                textContainer:textContainer]; 
     textView.scrollEnabled = NO; 
     [self.scrollView addSubview:textView]; 



     // Increase the current offset 
     currentXOffset += CGRectGetWidth(textViewFrame); 

     // And find the index of the glyph we've just rendered 
     lastRenderedGlyph = NSMaxRange([_layoutManager glyphRangeForTextContainer:textContainer]); 

     NSLog(@"Last rendered glyph %i",lastRenderedGlyph); 

     NSLog(@"Textview length %i",textView.text.length); 

     NSRange range = {lastRenderedGlyph-1, lastRenderedGlyph}; 

     NSRange glyphRange; 

     // Convert the range for glyphs. 
     [_layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange]; 

     NSLog(@"Glyph rect %@",NSStringFromCGRect([_layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer])); 
    } 

    // Need to update the scrollView size 
    CGSize contentSize = CGSizeMake(currentXOffset, CGRectGetHeight(self.scrollView.bounds)); 
    self.scrollView.contentSize = contentSize; 
} 

выход является:

Newspaper[89217:a0b] Last rendered glyph 711 
Newspaper[89217:a0b] Textview length 2585 
Newspaper[89217:a0b] Glyph rect {{121.556, 515.3761}, {13.444, 14.315979}} 
Newspaper[89217:a0b] Last rendered glyph 1441 
Newspaper[89217:a0b] Textview length 2585 
Newspaper[89217:a0b] Glyph rect {{129.15199, 515.3761}, {5.8480072, 14.315979}} 
Newspaper[89217:a0b] Last rendered glyph 2155 
Newspaper[89217:a0b] Textview length 2585 
Newspaper[89217:a0b] Glyph rect {{111.80001, 515.3761}, {23.199989, 14.315979}} 
Newspaper[89217:a0b] Last rendered glyph 2585 
Newspaper[89217:a0b] Textview length 2585 
Newspaper[89217:a0b] Glyph rect {{92.720001, 329.26801}, {3.552002, 14.31601}} 

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

Надеюсь, это поможет!

3

Вы можете создать CTFramesetter и вызвать CTFramesetterSuggestFrameSizeWithConstraints. Затем вы найдете диапазон текста, который соответствует заданному CGSize. Затем манипулируйте текстом в соответствии с диапазоном, и все готово.

Ссылка - CoreText.

+0

Спасибо за ваш ответ. , , Но это несколько сложнее. Мне потребовались некоторые простые методы, которые я получил от другого ответа. ... –

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