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


262

Давайте посмотрим, что у меня строка выглядит следующим образом:

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

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

AAAAA
BBBBB
CCCCC

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

Ответы:


332

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

Ссылка, замена устаревшего размера с шрифтом: в 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
UILabelне имеет свойства originни sizeна iOS? Вероятно, должно быть label.frame.origin.xи т. Д.
Peterdk

1
Вместо использования sizeWithAttributes, а затем установки фрейма, вы можете просто вызвать sizeToFit для тренировки и установить размер фрейма за один быстрый шаг.
jimmyjudas

@ Герман, спасибо за редактирование ответа, чтобы обновить его.
Джерри Шоу

275

введите описание изображения здесь

Используйте option-return при вводе в маленькое поле в Интерфейсном Разработчике, чтобы вставить перевод строки (\ n). В атрибутах Label Интерфейсного Разработчика установите # Lines = 0.

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


2
это супер полезно!
Нитин Алабур

Искал это вечно. Спасибо :)
Шаи Мишали

Фантастический ответ. Спасибо!
ТотороТоторо

1
Не работает при программной установке метки и добавлении \ n (новой строки) в строку.
Chewie The Chorkie

удивительный. Моим требованием было сделать это только с надписью раскадровки. И это сработало как шарм.
Теджас

132

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

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


1
iOS не анализирует \nпри получении строк с Parse.com (я думаю, это также случится при получении строк из других API)
Брайан,

Ты спас мой день. Я получаю строку с символом новой строки из XML-файлов.
Сенри

127

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

ааа
ааааааа


Нет, я не голосовал против. Я просто отредактировал ответ для лучшей презентации.
m4n0

Так действительно просто! +1
marlonpya

2
Не могу поверить, я никогда не знал этот трюк! Я попробовал Shift-Enter, потому что это довольно стандартно в другом месте. Спасибо за это!
Эшелон

это было именно то, что я искал! спасибо +1!
rickrvo

1
Отличный пост! Небольшое исправление: я полагаю, вы имеете в виду insert \ n вместо insert / n
craft

25

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


22

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


10

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

7

Просто сделай это так

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;

Это работает .. :)
Бибин Джозеф

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

4

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

3

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

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

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

введите описание изображения здесь


3

Для тех из вас, кто хочет простое решение, выполните следующие действия в поле ввода Текстовая метка:

Убедитесь, что ваши номера строки установлены на 0.

Alt + Enter

(Alt - ваш ключ выбора)

Ура!



2

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

Привет

Мир

в конструкторе интерфейсов.


Превосходно! Работает.
ДмитрийКанунниковофф

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"

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

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

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

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;

0

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


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;  
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.