2011-12-02 69 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的帧,以使其完全符合文本。

希望这有助于!