让我们看看我有一个如下所示的字符串:
NSString *longStr = @"AAAAA\nBBBBB\nCCCCC";
如何使 UILabel 显示这样的消息
AAAAA BBBBB CCCCC
我认为 UILabel 无法识别 \n
,所以我可以在 NSString 中放入任何东西,以便 UILabel 知道它必须在那里创建换行符吗?
使用您在字符串中使用的 \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);
https://i.stack.imgur.com/svM3H.png
在 Interface Builder 的小框中键入时使用 option-return 来插入换行符 (\n)。在 Interface Builder 的 Label 属性中,设置 # Lines = 0。
选择标签,然后将 Lines 属性更改为 0,如上图所示,然后在字符串中使用 \n 进行换行。
在界面生成器中,您可以使用 Ctrl + Enter 将 /n
插入到您想要的位置。这种方式可以实现以下情况
啊啊啊啊
如果您从 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;
因此,您必须用硬编码 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
(= 标签中的行数不受限制)。
不知道为什么 Apple 选择不解析从 XML 读取的字符串中的 \n
?
希望这可以帮助。
\n
(我猜从其他 API 获取字符串时也会发生这种情况)
您必须在 UILabel
上设置 numberOfLines
属性。默认值为 1,如果您将其设置为 0,它将删除所有限制。
重要的是要注意它是 \n
(反斜杠)而不是 /n
。
对于那些想要简单解决方案的人,请在 Interface Builder 的文本标签输入框中执行以下操作:
确保您的行数设置为 0。
Alt + Enter
(Alt 是您的选项键)
干杯!
在 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"
}
在 xCode 11、Swift 5 中,\n
工作正常,请尝试以下代码:
textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"
就这样做
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;
// 不要忘记将 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];
如果您使用 UILabel
,则必须记住默认设置为 1 行,因此添加多少个中断(\n
或 \r
)并不重要,您需要确保将其设置为大于一行,因此可以允许附加更多行。
一种替代方法是使用真正用于多行的 UITextView
。
您可以在 UILabel 的 XCode 属性部分轻松实现此目的,请参见屏幕截图:
https://i.stack.imgur.com/x8jFP.png
在 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;
在我的情况下, \n 也无法正常工作,我通过将行数保持为 0 并复制并粘贴文本本身来解决问题,例如,而不是 Hello \n World 我粘贴
你好世界
在界面生成器中。
只需使用 label.numberOfLines = 0;
textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);
对于其他可能对 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;
如果您将 UILable 属性从普通设置为属性... UILabel 将保存多行文本,无论有多少段落,因为您的 UILabel 高度和宽度设置为适合您要显示文本的屏幕区域。
我遇到了同样的问题,这里是我如何解决这个问题。希望这对某人有帮助。
// 斯威夫特 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;
不定期副业成功案例分享
UILabel
在 iOS 上没有origin
或size
属性吗?它可能应该是label.frame.origin.x
等。