【问题标题】:How to add line break for UILabel?如何为 UILabel 添加换行符?
【发布时间】:2011-01-19 18:03:13
【问题描述】:

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

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

如何让 UILabel 显示这样的消息

AAAAA
BBBBB
中国交建

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

【问题讨论】:

    标签: ios iphone uilabel newline line-breaks


    【解决方案1】:

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

    确保您的行数设置为 0。

    Alt + Enter

    (Alt 是您的选项键)

    干杯!

    【讨论】:

      【解决方案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"
      

      【讨论】:

        【解决方案3】:

        就这样吧

        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】:

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

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

          【讨论】:

          • 这个超级有用!
          • 一直在寻找这个。谢谢:)
          • 很棒的答案。谢谢!
          • 以编程方式设置标签并将\n(换行符)添加到字符串时不起作用。
          • 太棒了。我的要求是仅使用情节提要标签来执行此操作。这就像一个魅力。
          【解决方案5】:

          在 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"
           }
          

          【讨论】:

            【解决方案6】:

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

            // 斯威夫特 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;  
            

            【讨论】:

              【解决方案7】:

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

              aaa
              aaaaaaa

              【讨论】:

              • 不,我没有投反对票。我刚刚编辑了答案以便更好地展示。
              • 真的很简单! +1
              • 不敢相信我从来不知道这个把戏!我试过 shift-Enter 因为这在其他地方是相当标准的。谢谢!
              • 这正是我想要的!谢谢+1!
              • 好帖子!小修正:我相信你的意思是插入 \n 而不是插入 /n
              【解决方案8】:
              textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
              textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
              textLabel.lineBreakMode = UILineBreakModeWordWrap;
              NSLog(@"The textLabel text is - %@",textLabel.text);
              

              【讨论】:

                【解决方案9】:

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

                你好

                世界

                在界面构建器中。

                【讨论】:

                • 太棒了!工作。
                【解决方案10】:

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

                【讨论】:

                  【解决方案11】:

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

                  【讨论】:

                    【解决方案12】:

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

                    【讨论】:

                      【解决方案13】:
                      NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
                      NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];
                      

                      【讨论】:

                        【解决方案14】:

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

                        【讨论】:

                        • UILabel 在 iOS 上没有 originsize 属性吗?应该是label.frame.origin.x 等。
                        • 无需使用 sizeWithAttributes 来设置框架,您只需调用 sizeToFit 即可快速计算并设置框架大小。
                        • @Hermang,感谢您编辑答案以使其保持最新状态。
                        【解决方案15】:

                        对于其他可能遇到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);
                        

                        【讨论】:

                          【解决方案16】:

                          如果您从 XML 文件中读取字符串,则此字符串中的换行符 \nUILabel 文本中将不起作用。 \n 未解析为换行符。

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

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

                          因此,您必须将字符串中未解析的 \n 部分替换为硬编码的 NSString 中已解析的 \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

                          希望这会有所帮助。

                          【讨论】:

                          • iOS 在从 Parse.com 获取字符串时不解析 \n(我猜从其他 API 获取字符串时也会发生这种情况)
                          • 你拯救了我的一天。我正在从 xml 文件中获取带有换行符的字符串。
                          【解决方案17】:

                          如果您使用UILabel,您必须记住默认设置为 1 行,因此添加多少个中断(\n\r)并不重要,您需要确保已设置到多于一行,因此可以允许附加更多行。

                          另一种方法是使用UITextView,它真正用于多行。

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

                          【讨论】:

                          • 如果您将行数设置为 0,那么您将保证行数不受限制,因此如果您的代码将来更改为...超过 3 行,那么您将不会遇到问题。尚不清楚 Apple 为何采用这种方法。
                          【解决方案18】:

                          只使用label.numberOfLines = 0;

                          【讨论】:

                            【解决方案19】:

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

                            【讨论】:

                              【解决方案20】:

                              // 不要忘记将 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];
                              

                              【讨论】:

                                【解决方案21】:

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

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 2012-06-25
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2021-06-14
                                  • 2016-07-19
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多