UILabel Word Wrap / Character Wrap

时间:2011-12-02 10:50:30

标签: objective-c ios cocoa-touch uilabel

我有一个UILabel,lineBreakMode设置为UILineBreakModeWordWrap。这工作正常,除非我有一块没有空格的长文本。在这种情况下,它不会包裹文本的长板,而是在它到达UILabel框架的右端时切断它。如何告诉UILabel在这种情况下它应该包裹在字符边界 only (基本上等同于UILineBreakModeCharacterWrap设置,但仅限于那些长空间的无空间文本)。

提前致谢!

4 个答案:

答案 0 :(得分:10)

对于其他有同样问题的人,我最终使用UITextView代替UILabel来解决问题。这是最好的解决方案,原因有两个:

  1. 它不需要任何自定义行为来确定文本是否包含空格并将UILabel的换行模式更改为/从单词/字符换行。

  2. 更重要的是,有一个边缘情况,你可能有正常的单词(你想要包装在单词边界上)加上超长文本(你需要在字符边界上包装)。如果没有写一些逻辑来在一个超长的文本中插入一个空格(在正确的位置)来强制“假的自动换行”,我根本无法看到任何方法来处理文字和字符的换行,具体取决于具体情况,在UILabel之内。 UITextView会自动处理这种情况,根据需要打破单词边界或字符边界。

  3. 有关我如何执行此操作的详细信息,我有一行UITextView禁用编辑和滚动。我还将.contentInset设置为移除填充,使其看起来(对于毫无防备的眼睛)就像UILabel一样。然后我使用sizeWithFont:constrainedToSize:lineBreakMode:方法确定渲染文本的框架,并相应地调整UITextView的框架,使其完全适合文本。

    希望这有帮助!

答案 1 :(得分:3)

执行此操作的一种方法是在IB中设置Lines属性。

enter image description here

或从代码执行此操作 -

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;
        }