我有一个UILabel,lineBreakMode
设置为UILineBreakModeWordWrap
。这工作正常,除非我有一块没有空格的长文本。在这种情况下,它不会包裹文本的长板,而是在它到达UILabel框架的右端时切断它。如何告诉UILabel在这种情况下它应该包裹在字符边界 only (基本上等同于UILineBreakModeCharacterWrap
设置,但仅限于那些长空间的无空间文本)。
提前致谢!
答案 0 :(得分:10)
对于其他有同样问题的人,我最终使用UITextView
代替UILabel
来解决问题。这是最好的解决方案,原因有两个:
它不需要任何自定义行为来确定文本是否包含空格并将UILabel
的换行模式更改为/从单词/字符换行。
更重要的是,有一个边缘情况,你可能有正常的单词(你想要包装在单词边界上)加上超长文本(你需要在字符边界上包装)。如果没有写一些逻辑来在一个超长的文本中插入一个空格(在正确的位置)来强制“假的自动换行”,我根本无法看到任何方法来处理文字和字符的换行,具体取决于具体情况,在UILabel
之内。 UITextView
会自动处理这种情况,根据需要打破单词边界或字符边界。
有关我如何执行此操作的详细信息,我有一行UITextView
禁用编辑和滚动。我还将.contentInset
设置为移除填充,使其看起来(对于毫无防备的眼睛)就像UILabel
一样。然后我使用sizeWithFont:constrainedToSize:lineBreakMode:
方法确定渲染文本的框架,并相应地调整UITextView
的框架,使其完全适合文本。
希望这有帮助!
答案 1 :(得分:3)
执行此操作的一种方法是在IB中设置Lines属性。
或从代码执行此操作 -
textLabel.lineBreakMode = UILineBreakModeWordWrap;
textLabel.numberOfLines = 3;
因此,当您将行数设置为3时,文本将换行,直到占用多行为止。
答案 2 :(得分:0)
你必须自己做,没有选择'使用自动换行,除非我不想要你')
如果一个单词太长,你可以在显示它之前插入空格,以帮助标签知道在哪里换行?
答案 3 :(得分:0)
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;
}