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 自动换行/字符换行的主要内容,如果未能解决你的问题,请参考以下文章