Objective c ui标签换行/字符换行

Objective c ui标签换行/字符换行,objective-c,ios,cocoa-touch,uilabel,Objective C,Ios,Cocoa Touch,Uilabel,我有一个将lineBreakMode设置为uilinebreakmodewrap的UILabel。这很好,除非我有一个没有空格的长文本。在这种情况下,它不会包裹长文本板,而是在到达UILabel框架的右端时将其切断。我如何告诉UILabel,在这种情况下,它应该仅在字符边界上换行(基本上等同于UILineBreakModeCharacterWrap设置,但仅适用于那些无空格的长文本) 提前谢谢 你必须自己动手,没有“使用文字包装,除非我不想让你这么做”的选项:) 如果单词太长,可以在显示之前在其

我有一个将
lineBreakMode
设置为
uilinebreakmodewrap
的UILabel。这很好,除非我有一个没有空格的长文本。在这种情况下,它不会包裹长文本板,而是在到达UILabel框架的右端时将其切断。我如何告诉UILabel,在这种情况下,它应该仅在字符边界上换行(基本上等同于
UILineBreakModeCharacterWrap
设置,但仅适用于那些无空格的长文本)


提前谢谢

你必须自己动手,没有“使用文字包装,除非我不想让你这么做”的选项:)


如果单词太长,可以在显示之前在其中插入空格,以帮助标签知道在何处换行?

一种方法是在IB中设置Lines属性

或根据《守则》—

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

因此,当您将行数设置为3时,文本将换行,直到有那么多行被占用。

dean是对的。如果你想要它,你必须手动操作。下面的代码将对标签进行文字包装,即使它没有空格。这可能会有帮助

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

对于其他有同样问题的人,我最终通过使用
UITextView
而不是
UILabel
解决了这个问题。这是最好的解决方案,原因有二:

  • 它不需要任何自定义行为来确定文本是否包含空格,也不需要将
    UILabel
    的换行模式更改为word/character wrap

  • 更重要的是,有一种边缘情况,您可以使用普通单词(要在单词边界上换行)加上超长文本(需要在字符边界上换行)。除了编写某种逻辑将空格插入超长文本(在正确的位置)以强制“假换行”之外,我看不到任何方法来处理单词和字符的换行,这取决于一个
    UILabel
    UITextView
    自动处理这种情况,根据需要打破单词边界或字符边界

  • 有关如何执行此操作的详细信息,我有一个单行
    UITextView
    ,其中禁用了编辑和滚动。我还设置了
    .contentInset
    ,以移除填充物,使其看起来(在不知情的人看来)就像
    UILabel
    。然后,我使用
    sizeWithFont:constrainedToSize:lineBreakMode:
    方法来确定渲染文本的框架,并相应地调整
    UITextView
    的框架,使其完全适合文本


    希望这有帮助

    OP特别想要“word wrap”,如果他只有一个单词(例如“Llanfairpwlgwyngyllgogerychwyrndrobwllllantysiliogogogogoch”,它比文本框宽),就不会自动换行,不管你给它多少行:)给未来读者(像我一样)的提示:使用iOS 7和SDK 8进行测试,UILineBreakModeWordWrap现在看起来像人们希望的那样工作。也就是说,在可能的情况下,它是按单词来划分的,但如果需要的话,它是按字符来划分的。这是一个UILabel。