Как добавить разрыв строки для UILabel?

Посмотрим, что строка имеет вид:

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

Как сделать так, чтобы UILabel отображал сообщение, подобное этому

AAAAA
BBBBB
CCCCC

Я не думаю, что \n распознается UILabel, так есть ли что-нибудь, что я могу поместить внутри NSString, чтобы UILabel знал, что он должен создать там разрыв строки?

Ответ 1

Используйте \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);

Ответ 2

введите описание изображения здесь Используйте опцию-возврат при вводе в маленьком ящике в Interface Builder для вставки строки (\n). В атрибутах Label Interface Builder установите # Lines = 0.

Выберите метку, а затем измените свойство Lines на 0, как показано на рисунке ниже, а затем используйте \n в строке для разрыва строки.

Ответ 3

Если вы читаете строку из файла XML, строка break \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 в hardcoded 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 решила не анализировать \n в строках, прочитанных из XML?

Надеюсь, что это поможет.

Ответ 4

В построителе интерфейса вы можете использовать Ctrl + Enter, чтобы вставить /n в нужную позицию. Этот способ может реализовать следующую ситуацию.

aaa
aaaaaaa

Ответ 5

Вы должны установить свойство numberOfLines в UILabel. Значение по умолчанию 1, если вы установите его на 0, он удалит все ограничения.

Ответ 6

Важно отметить это \n (обратная косая черта), а не /n.

Ответ 7

//Не забудьте установить numOfLines на нуль

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

В Swift 2.2, > iOS 8

Я установил Lines = 0 на Storyboard, в соответствии с Attribute Inspector и связал выход ссылки с меткой. Затем используйте в контроллере следующее:

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

Ответ 9

Если вы используете UILabel, вы должны помнить, что значение по умолчанию - 1 строка, поэтому не имеет значения, сколько слотов вы добавляете (\n или \r), вам нужно убедиться, что он установлен для более чем одной строки, чтобы было возможно добавить больше строк.

Один из вариантов заключается в использовании UITextView, который действительно предназначен для мультилиний.

Вы можете легко достичь этого в разделе атрибута XCode UILabel, см. снимок экрана:

enter image description here

Ответ 10

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

Ответ 11

Just use like this :)

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;

Ответ 12

Просто используя label.numberOfLines = 0;

Ответ 13

Для всех, у кого могут возникнуть проблемы с 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);

Ответ 14

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

Ответ 15

Мне кажется неправильным изменять размеры рамок этикетки, особенно при использовании автозапуска. Использование метода 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;

Ответ 16

Если вы установили свойства UILable из Plain в Attributed..., UILabel будет содержать многострочный текст независимо от того, сколько абзацев осталось, так как высота и ширина вашего UILabel установлены так, чтобы они соответствовали области экрана, в которой вы хотите отобразить текст.

Ответ 17

В моем случае и \n не работал, я исправил проблему, сохранив число строк до 0 и скопировав и вставив текст с новой строкой, например, вместо Hello\n World i, вставленной

Hello

Мир

в построителе интерфейса.

Ответ 18

textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);

Ответ 19

Я столкнулся с такой же проблемой, и вот, как я решил проблему. Надеюсь, это будет полезно для кого-то.

//Swift 2

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

//Objective-C

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

//С# (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;