280

让我们看看我有一个如下所示的字符串:

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

如何使 UILabel 显示这样的消息

AAAAA
BBBBB
CCCCC

我不认为\nUILabel 可以识别,所以我可以在 NSString 中放入任何东西,以便 UILabel 知道它必须在那里创建换行符吗?

4

21 回答 21

343

\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);
于 2010-02-23T00:50:13.617 回答
292

在此处输入图像描述

在 Interface Builder 的小框中键入时使用 option-return 来插入换行符 (\n)。在 Interface Builder 的 Label 属性中,设置 # Lines = 0。

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

于 2011-01-03T22:49:24.427 回答
141

在界面生成器中,您可以使用Ctrl+Enter插入/n到您想要的位置。这种方式可以实现以下情况

啊啊
啊啊

于 2015-09-14T10:14:37.473 回答
135

如果从 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字符串中未解析的部分替换\n为硬编码中的已解析部分NSString

这是我的其他标签设置:

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

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

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

希望这可以帮助。

于 2011-01-04T00:29:38.927 回答
26

您必须numberOfLinesUILabel. 默认值为1,如果将其设置为0,它将删除所有限制。

于 2010-02-22T17:58:53.557 回答
24

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

于 2010-05-10T11:02:47.537 回答
12

在 Swift 2.2 中,> iOS 8

我在 Storyboard 上的 Attribute Inspector 下设置了 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"
 }
于 2016-06-10T00:08:26.737 回答
11

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

确保您的行数设置为 0。

Alt+Enter

(Alt 是您的选项键)

干杯!

于 2020-03-31T03:38:57.860 回答
7

就这样做

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;
于 2016-07-28T09:26:53.343 回答
7

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

textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"
于 2020-01-04T18:36:47.747 回答
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];
于 2012-03-05T12:03:44.607 回答
4

如果您使用 a您必须记住默认设置是 1 行,因此添加多少个中断(或)UILabel无关紧要,您需要确保将其设置为多于一行,以便允许附加更多行。\n\r

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

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

在此处输入图像描述

于 2013-10-25T16:19:46.540 回答
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;
于 2015-07-22T09:47:49.327 回答
3

在我的情况下, \n 也无法正常工作,我通过将行数保持为 0 并复制并粘贴文本本身来解决问题,例如,而不是 Hello \n World 我粘贴

你好

世界

在界面生成器中。

于 2015-08-15T08:12:06.583 回答
2

只是使用label.numberOfLines = 0;

于 2014-01-10T09:49:24.670 回答
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);
于 2015-08-15T08:51:04.817 回答
0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];
于 2015-02-16T13:53:23.167 回答
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);
于 2014-07-15T23:38:51.413 回答
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;
于 2015-07-06T16:59:33.050 回答
0

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

// 斯威夫特 2

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

// 目标-C

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

// C# (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
于 2015-12-07T10:27:52.330 回答
0

如果您将 UILable 属性从普通设置为属性... UILabel 将保留多行文本,无论您的 UILabel 高度和宽度设置为适合您要在其中显示文本的屏幕区域有多少段落。

于 2015-08-11T11:12:34.187 回答