Як додати розрив рядка для UILabel?


262

Нехай побачить, що я маю такий рядок:

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

Як зробити так, щоб UILabel відображав повідомлення таким чином

AAAAA
BBBBB
CCCCC

Я не думаю \n, що UILabel не визнається, так що я можу помістити всередині NSString, щоб UILabel знав, що він повинен створити там розрив лінії?

Відповіді:


332

Використовуйте так, \nяк ви використовуєте в рядку.

Встановіть числоOfLines на 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:

Довідка, Заміна застарілого розміруWithFont: в 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не має originsizeвластивості на iOS? Це, мабуть, повинно бути label.frame.origin.xі т. Д.
Peterdk

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

@Hermang, дякую за редагування відповіді, щоб оновити її.
Геррі Шоу

274

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

Використовуйте опцію повернення під час введення в маленьке поле в програмі Interface Builder, щоб вставити канал рядка (\ n). В атрибутах Label Builder's Label встановіть # Lines = 0.

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


2
це супер корисно!
Нітін Алабур

Шукав це назавжди. Дякую :)
Шай Мішалі

Фантастична відповідь. Дякую!
Macondo2Seattle

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в потрібне положення. Таким чином можна реалізувати таку ситуацію

aaa
aaaaaaa


Ні, я не проголосував. Я просто відредагував відповідь для кращого представлення.
Маной Кумар

Так справді просто! +1
marlonpya

2
Не можу повірити, я ніколи не знав цього фокусу! Я б спробував shift-Enter, тому що це досить стандартно в інших місцях. Дякую за це!
Ешелон

саме це я шукав! дякую +1!
rickrvo

1
Чудовий пост! Невелика корекція: я вважаю, ви маєте на увазі вставку \ n замість вставки / п
ремесло

25

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


22

Важливо відзначити, що це \n(зворотний кут), а не /n.


10

У Swift 2.2, iOS 8

Я встановив Lines = 0 на Storyboard, в інспекторі атрибутів і зв’язав посилання на відмітку. Потім використовуйте такий контролер:

 @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

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

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

6

Просто роби це так

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

У 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

Я зіткнувся з тією ж проблемою, і ось, як я вирішив проблему. Сподіваюся, це комусь буде корисним.

// Швидкий 2

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

// Завдання-С

  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.