如何为UILabel添加换行符?

时间:2010-02-22 17:52:18

标签: ios iphone uilabel newline line-breaks

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

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

如何使UILabel显示如下信息

  

AAAAA
  BBBBB
  CCCCC

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

20 个答案:

答案 0 :(得分:317)

在字符串中使用\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:

参考,Replacement for deprecated sizeWithFont: in 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);

答案 1 :(得分:260)

enter image description here

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

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

答案 2 :(得分:129)

如果您从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;

最重要的是将numberOfLines设置为0(=标签中无限数量的行)。

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

希望这有帮助。

答案 3 :(得分:25)

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

答案 4 :(得分:22)

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

答案 5 :(得分:8)

在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 :(得分:6)

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

确保行数设置为0。

Alt + 输入

(Alt是您的选择键)

干杯!

答案 7 :(得分: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];

答案 8 :(得分:5)

就这样做吧

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;

答案 9 :(得分:3)

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

答案 10 :(得分:3)

如果您使用UILabel,则必须记住默认设置为1行,因此无论您添加了多少次中断(\n\r),都需要确保将其设置为多行,以便可以添加更多行。

另一种方法是使用UITextView,它实际上是用于多行的。

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

enter image description here

答案 11 :(得分:2)

只需使用label.numberOfLines = 0;

答案 12 :(得分:2)

在我的情况下\ n也没有用,我通过将行数保持为0来修复问题,并用新行本身复制和粘贴文本,例如代替Hello \ n World i pasted

  

您好

     

世界

在界面构建器中。

答案 13 :(得分: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"

答案 14 :(得分: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);

答案 15 :(得分:0)

对于可能在sizeWithFont:constrainedToSize:lineBreakMode:或任何人切换到ios 8时遇到问题的其他人(该方法自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);

答案 16 :(得分:0)

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

答案 17 :(得分: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;

答案 18 :(得分:0)

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

答案 19 :(得分: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;