如何为UILabel添加换行符?

让我们看看我有一个这样的字符串:

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

如何使UILabel像这样显示消息

< p >五星级< br / > BBBBB < br / > CCCCC < / p >

我不认为UILabel能识别\n,那么我是否可以在NSString中放入一些东西以便UILabel知道它必须在那里创建换行符?

301279 次浏览

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

使用\n,就像在字符串中使用一样。

将numberolines设置为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);

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

enter image description here

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

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

如果从XML文件中读取字符串,则该字符串中的换行符\nUILabel文本中无效。\n不会被解析为换行符。

这里有一个小技巧来解决这个问题:

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


myLabel.text = myLabelText;

所以你必须用硬编码的NSString中解析过的\n替换字符串中未解析的\n部分。

以下是我的其他标签设置:

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 (= label中的行数不限)。

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

希望这能有所帮助。

//不要忘记将numberolines设置为0

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

如果你使用UILabel,你必须记住默认设置是1行,所以不管你添加了多少换行符(\n\r),你需要确保它被设置为不止一行,这样它就可以被允许追加更多的行。

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

你可以在UILabel的XCode属性部分轻松实现这一点,见截图:

enter image description here

只是使用label.numberOfLines = 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);
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];

对我来说,改变标签帧大小似乎是错误的,尤其是在使用自动布局时。使用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;

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

如果你将可用属性从普通设置为有属性…UILabel将保存多行文本,无论你的UILabel高度和宽度设置为适合你想要显示文本的屏幕区域。

在我的情况下,也\n是不工作的,我通过保持行数为0,复制和粘贴文本与新行本身例如,而不是Hello \n世界我粘贴

你好

世界

在接口构建器中。

textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);
在接口构建器中,你可以使用Ctrl + 输入/n插入到你想要的位置。 这种方式可以实现以下情况

aaa < br > aaaaaaa < br >

我也遇到过同样的问题,下面是我解决问题的方法。希望这对某些人有所帮助。

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

在Swift 2.2, > iOS 8

我在Storyboard的属性检查器下设置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"
}

就像这样做

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;

在xCode 11, Swift 5的\n工作正常,尝试下面的代码:

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

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

确保你的行数设置为0。

__abc0 + __abc1

(Alt是你的选项键)

干杯!