2011-12-02 72 views
9

我有一個UILabel,其中lineBreakMode設置爲UILineBreakModeWordWrap。這工作正常,除非我有一長串文字沒有空格。在這種情況下,它不包裹長長的文本塊,而是在它到達UILabel幀的右端時將其切斷。我怎麼能告訴UILabel它應該在這種情況下包裝在角色邊界上只有(基本上相當於UILineBreakModeCharacterWrap設置,但只適用於無空間文本的長板)。UILabel Word Wrap/Character Wrap

在此先感謝!

+1

未來的讀者請注意(像我一樣):使用iOS 7和SDK 8進行測試時,UILineBreakModeWordWrap看起來像現在希望的那樣工作。也就是說,如果可能的話,它會通過單詞分解,但如果需要則通過字符分解這個如果用於UILabel。 – eselk

回答

0

你必須做你自己,還有「除非我不希望你使用自動換行」爲沒有選擇:)

如果一個詞太長,你可以前插入空格到它你展示它來幫助標籤知道在哪裏包裝?

3

這樣做的一種方法是在IB中設置Lines屬性。當你設置的行數爲3的文本換行到那很多線路都佔據

textLabel.lineBreakMode = UILineBreakModeWordWrap; 
textLabel.numberOfLines = 3; 

所以 -

enter image description here

或代碼做到這一點。

+1

如果他有一個單詞(例如'Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch',它比文本框更寬),那麼OP就會特別想要'自動換行',不管你給它多少行:) – deanWombourne

0

院長是對的。如果你想要它,你必須手動完成。下面的代碼將wordwrap一個標籤,即使它沒有空格。這可能有助於

  NSString *someText = yourLabel.text; 

    //Check if the text contains spaces  
//The method in the below if condition is user defined and you have to define one. lol 
     if(![self textContainsSpaces:someText]) 
     { 
     //Do the word wrap manually 
      CGSize constraintSize; 

      constraintSize.width = 165; 

      constraintSize.height = 165; 

      CGSize stringSize =[someText sizeWithFont: [UIFont boldSystemFontOfSize: 17] constrainedToSize: constraintSize lineBreakMode: UILineBreakModeWordWrap]; 

      CGRect rect = CGRectMake(yourLabel.frame.origin.x, yourLabel.frame.origin.y, 165, (stringSize.height+10)); 

      yourLabel.frame = rect; 
     } 
9

爲別人有同樣的問題,我最終行動使用UITextView代替UILabel的解決它。這是有兩個原因的最佳解決方案:

  1. 它不需要任何自定義的行爲,以確定文本是否包含空格和字/字符換改變UILabel的換行模式/。

  2. 更重要的是,有一個邊緣情況下,您可能會有正常的單詞(您想要在單詞邊界上換行)加上超長文本(您需要在字符邊界上換行)。寫一些邏輯來在超長文本中插入空格(在正確的位置)來強制「僞單詞換行」我根本看不到任何處理文字和字符換行的方法,具體取決於情況,在一個UILabel內。 UITextView自動處理這種情況,必要時打破字邊界或字符邊界。

關於我如何做這件事的具體細節,我有一行UITextView,禁用了編輯和滾動功能。我還設置了.contentInset以刪除填充,使其看起來像(不知情的眼睛),就像UILabel一樣。然後,我使用sizeWithFont:constrainedToSize:lineBreakMode:方法來確定渲染文本的幀,並相應地調整UITextView的幀,以使其完全符合文本。

希望這有助於!