2014-02-08 137 views
9

我想在不同視圖的TextView中加載長文本。文本應該在文本查看結束時分割爲多個頁面。接下來的文本視圖必須以文本的延續開始。如何限制ios中UITextView的內容

我已經經歷了很多答案。但是,所有這些都指定了在輸入數據時限制文本內容我想在TextView中顯示分頁數據。並且不會有任何輸入或編輯。所以關於這個的委託方法將不起作用。

我試圖加載固定長度的文本。但是當段落數量變化時它是不正確的。

所以我試圖找到的是,當文本到達textview的能力結束時獲得通知或獲取textview的能力,因爲沒有行/ no.of字符。有沒有辦法做到這一點?

更新

按照意見我有,我搜索了很多,在NSTextStorage,NSTextLayoutManager和NSTextContainer

達到

我發現這個鏈接,這將有助於輕鬆實現分頁

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

我這個例子他們用循環創建了4個對象。可以這樣說,他們已經將字符串分割爲4個部分,並以滾動視圖的4個uitextviews顯示。

我想設置一個條件來根據字符串的長度分割爲textcontainers。 我試圖通過考慮主要字符串&文本顯示的文本的總長度來創建一個條件。

enter image description here

但每次的TextView」文本長度是一樣的主串的總長度。所以我怎麼能得到textview每個textcontainer中顯示的長度文本?

+1

我覺得你最好的選擇將不受文字的'length'而是由'height'走了。你可以從'[NSString sizeWithAttributes:(NSDictionary *)attributes]' –

+0

'得到這個特性根據你的問題,你可能不得不使用'sizeWithAttributes'以及一些自定義的「chunkenizing」工具,pbb二進制搜索到哪裏裁剪字符串。 –

+1

我不確定這一點,但是在評估何時移動到下一個textView時,textView的contentSize應該不是一個有效值?我猜'粘貼'行動可能會導致問題。 – 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

它確實工作!我得到了我所擁有的nsattributedstring所需的CGRect。然後使用我創建的條件與我的textview尺寸進行比較。 。 。 。謝謝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

您是否想要檢查此按鈕點擊之類的任何點按事件,還是希望在textview中輸入文本時顯示警告消息? –

+1

我只是顯示文本。 .. textview不可編輯 –

0

如何分配總的文字給所有的文本視圖。然後,當我們從一個文本移動到另一個文本視圖時,我們只使用文本視圖的下面的功能。

- (void)scrollRangeToVisible:(NSRange)range; 

你會決定這個範圍應該是什麼開始,然後不斷改變它每次迭代,直到你到達字符串的結尾。

+1

嗨,所以我怎麼可以設置範圍。我想textview充滿文字。當我手動設置範圍時,它會隨段落數量的變化而變化。你有沒有想過在textview中獲得可見文本的長度?所以我可以通過測量來設定範圍。 。 。 。 –

+0

@KaranAlangat我會說試驗和錯誤應該給你最佳的範圍。因爲這很容易和快捷,直到你得到一個很好的答案。我的方法的一個缺點是,如果有段落在該範圍內結束或開始,則可能在頂部或底部留下一些空的位置。只有當你應用它時,你纔會是最好的評判。 – Rajesh

2

我不得不在UITextView前段時間對UITextView中的文本進行測量,以覆蓋iOS 5上UITextView中某些單詞的頂部視圖。使用iOS 7的UITextView更改,我不必再執行此操作。我測量的方式可能是你需要分解你的文本。我沒有一個好的工作代碼給出,所以我將不得不描述算法,因爲我能記住它。

當有可變的行高時,此算法不起作用。

  1. 我發現試錯誤文本寬度我需要來匹配是文本視圖的寬度減去16
  2. 請在文本的子二進制搜索找到適合的最大子UITexView的子字符串在字邊界處斷開。您可以使用NSLinguistic標記器來獲取單詞邊界。
  3. 對每個子串調用[substr sizeWithFont:font constrainedToSize:sizeConstraint lineBreakMode:NSLineBreakByWordWrapping],其中尺寸約束條件在第1步的寬度和非常大的高度上。
  4. 您將需要繼續搜索,直到您可以識別單詞邊界,其中word1的約束大小爲您提供適合您視圖的高度,並且緊接着的下一個單詞給出的高度不適合您的視圖。你會知道這是UITextView將進行文字換行的地方,因爲它太大而無法放在你的某個頁面上。
  5. 從步驟4中分離出文字邊界上的文字,併爲下一頁做同樣的事情。
+0

感謝您的回覆。 .. –

1

這裏有兩個元件:

一個很好的解釋/樣品的多列與IOS 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}} 

雕文矩形並不看起來不錯(我很感興趣地看到它正常工作) 但你得到顯示的最新字形

希望它有幫助!

3

您可以創建一個CTFramesetter並調用CTFramesetterSuggestFrameSizeWithConstraints。然後,您將找到適合給定CGSize的文本範圍。 然後按照範圍操作文本,就完成了。

參考 - CoreText

+0

感謝您的回覆。 。 。但它有點複雜。我需要一些簡單的方法,我從另一個答案中得到。 ..。 –