UILabel 自动换行/字符换行

Posted

技术标签:

【中文标题】UILabel 自动换行/字符换行【英文标题】:UILabel Word Wrap / Character Wrap 【发布时间】:2011-12-02 10:50:29 【问题描述】:

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

提前致谢!

【问题讨论】:

未来读者(如我)的注意事项:使用 ios 7 和 SDK 8 进行测试,UILineBreakModeWordWrap 似乎按照人们现在希望的方式工作。也就是说,它在可能的情况下按单词打断,但在需要时按字符打断。如果是 UILabel。 【参考方案1】:

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

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

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

关于我是如何做到这一点的细节,我有一行UITextView 禁用了编辑和滚动。我还设置了.contentInset 以移除填充,使其看起来(在不知情的情况下)就像UILabel。然后我使用sizeWithFont:constrainedToSize:lineBreakMode: 方法来确定渲染文本的框架,并相应地调整UITextView 的框架,使其完全适合文本。

希望这会有所帮助!

【讨论】:

【参考方案2】:

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

或从代码中执行此操作 -

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

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

【讨论】:

OP 特别想要'自动换行',如果他有一个单词,它就不会自动换行(例如,'Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch',它比文本框宽),无论你给它多少行:)【参考方案3】:

你必须自己做,没有选择'使用自动换行,除非我不想让你这样做':)

如果单词太长,您可以在显示之前插入空格以帮助标签知道在哪里换行?

【讨论】:

【参考方案4】:

迪恩是对的。如果你想要它,你必须手动完成。下面的代码将自动换行标签,即使它没有空格。这可能会有所帮助

         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;
        

【讨论】:

以上是关于UILabel 自动换行/字符换行的主要内容,如果未能解决你的问题,请参考以下文章

UIlabel多行文字自动换行 (自动折行)

UILabel 自动换行 和支持换行符

UILabel 有时不能正确换行(自动布局)

iOS 自动布局 UILabel 换行

即使有足够的空间可用于单词,UILabel 自动换行功能也会留下空间

多行 UILabel 没有正确换行 [重复]