如何为UILabel添加换行符?


262

让我们看看我的字符串看起来像这样:

NSString *longStr = @"AAAAA\nBBBBB\nCCCCC";  

如何使UILabel显示如下消息

AAAAA
BBBBB
CCCCC

我认为\nUILabel 无法识别它,所以我可以在NSString中放入任何内容,以便UILabel知道必须在其中创建换行符吗?

Answers:


332

使用\n如您使用的是您的字符串。

将numberOfLines设置为0以允许任意数量的行。

label.numberOfLines = 0;

使用来更新标签框架以匹配文本的大小sizeWithFont:。如果不这样做,您的文本将垂直居中或被截断。

UILabel *label; // set frame to largest size you want
...
CGSize labelSize = [label.text sizeWithFont:label.font
                          constrainedToSize:label.frame.size
                              lineBreakMode:label.lineBreakMode];
label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);

更新:已淘汰的替代品

sizeWithFont:constrainedToSize:lineBreakMode:

参考,已替换过时的sizeWithFont:在iOS 7中?

CGSize labelSize = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];

label.frame = CGRectMake(
    label.frame.origin.x, label.frame.origin.y, 
    label.frame.size.width, labelSize.height);

2
UILabel没有origin,也没有sizeiOS上的财产?它可能应该是label.frame.origin.x
Peterdk

1
无需使用sizeWithAttributes然后设置框架,您只需调用sizeToFit进行锻炼并快速设置框架大小。
jimmyjudas

@Hermang,感谢您编辑答案以使其更新。
Gerry Shaw

274

在此处输入图片说明

在Interface Builder中的小方框中输入换行符(\ n)时,请使用option-turn键。在“界面生成器”的“标签”属性中,设置“#行= 0”。

选择标签,然后将Lines属性更改为0(如上图所示),然后在字符串中使用\ n进行换行。


2
这超级有用!
Nitin Alabur 2015年

寻找这个永远。谢谢:)
Shai Mishali

很棒的答案。谢谢!
Macondo2Seattle 2015年

1
以编程方式设置标签并将\ n(换行符)添加到字符串时,该功能不起作用。
Chewie The Chorkie

惊人。我的要求是仅使用情节提要标签来执行此操作。这就像一个魅力。
Tejas

132

如果您从XML文件中读取字符串,则\n该字符串中的换行符在UILabel文本中将无效。该\n不会被解析到一个换行符。

这是解决此问题的小技巧:

// correct next line \n in string from XML file
NSString *myNewLineStr = @"\n";
myLabelText = [myLabelText stringByReplacingOccurrencesOfString:@"\\n" withString:myNewLineStr];

myLabel.text = myLabelText;

因此,您必须用经过硬编码\n的解析来替换字符串中未解析的部分。\nNSString

这是我的其他标签设置:

myLabel.numberOfLines = 0;
myLabel.backgroundColor = [UIColor lightGrayColor];
myLabel.textColor = [UIColor redColor]; 
myLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14.0];   
myLabel.textAlignment = UITextAlignmentCenter;

最重要的是设置numberOfLines0(=标签中的行数不受限制)。

不知道苹果为什么选择不解析\n从XML读取的字符串?

希望这可以帮助。


1
\n从Parse.com获取字符串时,iOS不会解析(我想从其他API获取字符串时也会发生)
Brian

你救了我的日子。我正在从xml文件中使用换行符获取字符串。
哨兵队'17

127

在界面构建器中,可以使用Ctrl+ Enter插入/n所需的位置。这种方式可以实现以下情况

aaa
aaaaaaa


不,我没有拒绝投票。我只是编辑了答案,以便更好地演示。
Manoj Kumar 2015年

真的很简单!+1
marlonpya

2
真不敢相信我从来不知道那个把戏!我尝试过shift-Enter,因为在其他地方这是相当标准的。感谢那!
梯队

这正是我想要的!谢谢+1!
rickrvo

1
很棒的帖子!小修正:我相信您的意思是插入\ n而不是插入/ n
制作

25

您必须在上设置numberOfLines属性UILabel。默认值为1,如果将其设置为0,它将删除所有限制。


22

重要的是注意它是\n(反斜杠)而不是/n


10

在Swift 2.2中,> iOS 8

我已经在“故事板”的“属性检查器”下设置了Lines = 0,并将引用出口链接到了标签。然后像这样在控制器中使用:

 @IBOutlet weak var listLabel: UILabel!

 override func viewDidLoad() {
      ...
      listLabel.text = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8"
 }

6

//不要忘记将numberOfLines设置为零

UILabel* locationTitle = [[UILabel alloc] initWithFrame:CGRectMake(5, 30, 230, 40)];
locationTitle.font = [UIFont systemFontOfSize:13.0];
locationTitle.numberOfLines = 0;
locationTitle.text = [NSString stringWithFormat:@"Eaton industries pvt. Ltd \nUK Apr 12"];
[cell addSubview:locationTitle];

6

就这样做

NSString * strCheck = @"A\nB";

strCheck = [strCheck stringByReplacingOccurrencesOfString:@"\\n" withString:@"\n"];  //This is to prevent for fetching string from plist or data structure

label.numberOfLines = 0;

label.lineBreakMode = NSLineBreakByWordWrapping;

label.text = strCheck;

4

在Xcode 6上,使用自动换行时,甚至可以在字符串内使用\ n。会的。因此,例如:

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, screenRect.size.width, 50)];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"This will be on the first line\nfollowed by a line under it.";
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;

3

如果您使用a UILabel,则必须记住默认设置为1行,因此添加(\n\r)的中断数量无关紧要,您需要确保将其设置为多行,以便可以附加多行。

一种替代方法是使用UITextView真正用于多行的方法。

您可以在UILabel的XCode属性部分中轻松实现此目的,请参见屏幕截图:

在此处输入图片说明


3

对于那些想要简单解决方案的人,请在文本标签输入框中执行以下操作:

确保您的数字行设置为0。

Alt + Enter

(Alt是您的选择键)

干杯!


2

只是使用 label.numberOfLines = 0;


2

在我的情况下,\ n也不起作用,我通过将行数保持为0来解决此问题,并使用新行本身复制并粘贴了文本(例如,而不是Hello \ n World)

你好

世界

在界面生成器中。


优秀的!作品。
DmitryKanunnikoff

2

在xCode 11中,Swift 5 \n可以正常工作,请尝试以下代码:

textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"

1
textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);

0

对于可能遇到问题sizeWithFont:constrainedToSize:lineBreakMode:或切换到ios8的任何人(此方法自ios7起已弃用),我改用sizeToFit来调整我的身高。

UILabel *label;
label.numberOfLines = 0;
// Setup label with desired settings
...
[label sizeToFit];
label.frame = CGRectMake(label.frame.origin.x,     // Or use any desired origin
                         label.frame.origin.y, 
                         label.frame.size.width,   // Or use any desired width
                         label.frame.size.height);

0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];

0

更改标签框尺寸似乎对我来说是错误的,尤其是在使用自动布局时。使用appendFormat方法似乎更合适。这是我的示例:

NSMutableString *list = [[NSMutableString alloc] init];
NSArray *textArray = @[@"AAAA", @"BBBB"];
for (NSString *string in textArray) {
    [list appendFormat:@"%@\n", string.mutableCopy];
}
self.label.text = list;
self.label.numberOfLines = 0;

0

如果将UILable属性从Plain设置为Attributed ...,则UILabel将容纳多行文本,因为将UILabel的高度和宽度设置为适合您要在其中显示文本的屏幕区域时,它沿用了多少段。


0

我遇到了同样的问题,这就是我如何解决问题的方法。希望这对某人有帮助。

// Swift 2

   lblMultiline.lineBreakMode = .ByWordWrapping // or use NSLineBreakMode.ByWordWrapping
   lblMultiline.numberOfLines = 0 

// Objective-C

  lblMultiline.lineBreakMode = NSLineBreakByWordWrapping;
  lblMultiline.numberOfLines = 0;

// C#(Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.