Jak dodać podział linii dla UILabel?

Zobaczmy, że mam ciąg wygląda tak:

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

Jak to zrobić, aby UILabel wyświetlał wiadomość w ten sposób

AAAAA
BBBBB
CCCCC

Wydaje mi się, że \n nie jest rozpoznawana przez UILabel, więc czy jest coś, co mogę umieścić wewnątrz NSString, aby UILabel wiedział, że musi tam utworzyć linię break?

Author: ROMANIA_engineer, 2010-02-22

21 answers

Użyj \n tak jak używasz w swoim łańcuchu.

Ustaw numberOfLines na 0, aby umożliwić dowolną liczbę linii.

label.numberOfLines = 0;

Zaktualizuj ramkę etykiety, aby dopasować rozmiar tekstu za pomocą sizeWithFont:. Jeśli tego nie zrobisz, tekst zostanie wyśrodkowany pionowo lub odcięty.

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

Update: Replacement for deprecated

sizeWithFont:constrainedToSize:lineBreakMode:

Reference, zastąpienie przestarzałego sizeWithFont: w 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);
 334
Author: Gerry Shaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:00

Tutaj wpisz opis obrazka

Użyj opcji-return podczas wpisywania w małym polu w Interface Builder, aby wstawić kanał wiersza (\n). W atrybutach etykiety Buildera interfejsu Ustaw # Lines = 0.

Wybierz etykietę, a następnie zmień właściwość Lines na 0, jak na powyższym obrazku, a następnie użyj \n w ciągu znaków do łamania linii.

 283
Author: Marco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 19:55:00

Jeśli czytasz łańcuch znaków z pliku XML, podział linii \n w tym łańcuchu nie będzie działał w tekście UILabel. \n nie jest przetwarzane do podziału linii.

Oto mała sztuczka, aby rozwiązać ten problem:

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

myLabel.text = myLabelText;

Więc musisz zastąpić nieparsowaną \n część w Twoim łańcuchu przez parsowaną \n w zakodowanym na twardo NSString.

Oto moje inne ustawienia etykiet:

myLabel.numberOfLines = 0;
myLabel.backgroundColor = [UIColor lightGrayColor];
myLabel.textColor = [UIColor redColor]; 
myLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:14.0];   
myLabel.textAlignment = UITextAlignmentCenter;

Najważniejsze jest ustawienie numberOfLines na 0 (=Nieograniczona liczba linii w etykiecie).

Nie pomysł dlaczego Apple zdecydowało się nie parsować \n w łańcuchach odczytywanych z XML?

Mam nadzieję, że to pomoże.
 134
Author: Al-Noor Ladhani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-12 23:08:24

W kreatorze interfejsu możesz użyć Ctrl + wprowadź , aby wstawić /n do żądanej pozycji. W ten sposób można zaimplementować następującą sytuację

Aaa
aaaaaaa

 134
Author: kuokuo321,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-13 10:01:09

Musisz ustawić numberOfLines właściwość na UILabel. Domyślną wartością jest 1, Jeśli ustawisz go na 0 usunie wszystkie ograniczenia.

 25
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-30 06:45:13

Ważne, aby pamiętać, że jest to \n (ukośnik wsteczny), a nie /n.

 24
Author: AndyOng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-18 13:31:25

W Swift 2.2,> iOS 8

Ustawiłem Lines = 0 Na Storyboardzie, pod Inspektorem atrybutów i połączyłem punkt odniesienia z etykietą. Następnie użyj w kontrolerze tak:

 @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"
 }
 12
Author: CodeOverRide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-10 00:08:26

Po prostu zrób to tak

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;
 7
Author: Sandip Patel - SM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 00:21:29

Dla tych z Was, którzy chcą łatwego rozwiązania, wykonaj następujące czynności w polu wprowadzania etykiety tekstowej w narzędziu Interface Builder:

Upewnij się, że liczba linii jest ustawiona na 0.

Alt + Enter

(Alt To twój klucz opcji)

Zdrówko!
 7
Author: Derwrecked,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-11 13:02:07

// nie zapomnij ustawić numeroflines na zero

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
Author: Pankaj Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 12:11:02

Na Xcode 6, można po prostu użyć \n nawet wewnątrz ciągu podczas korzystania z zawijania słowa. To zadziała. Tak na przykład:

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;
 4
Author: Roi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-22 09:47:49

Jeśli używasz UILabel, musisz pamiętać, że domyślnym ustawieniem jest 1 linia, więc nie ma znaczenia, ile przerw dodasz (\n lub \r), Musisz upewnić się, że jest ustawiona na więcej niż jedną linię, aby można było dołączyć więcej linii.

Alternatywą jest użycie UITextView, które jest tak naprawdę przeznaczone dla wielu linii.

Możesz to łatwo osiągnąć w sekcji atrybutów Xcode w etykiecie UILabel, zobacz zrzut ekranu:

Tutaj wpisz opis obrazka

 3
Author: meda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-01 14:46:18

W xCode 11, Swift 5 \n działa dobrze, wypróbuj poniższy kod:

textlabel.numberOfLines = 0
textlabel.text = "This is line one \n This is line two \n This is line three"
 3
Author: David_2877,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-07 10:34:51

Just using label.numberOfLines = 0;

 2
Author: Fry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 09:49:24

W moim przypadku również \N nie działa, naprawiłem problem, utrzymując liczbę linii do 0 i skopiowany i wklejony tekst z nowej linii sam na przykład zamiast Hello \N świat wkleiłem

Hello

Świat

W kreatorze interfejsów.

 2
Author: Ranjithkumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-15 08:12:06
textLabel.text = @"\nAAAAA\nBBBBB\nCCCCC";
textLabel.numberOfLines = 3; \\As you want - AAAAA\nBBBBB\nCCCCC
textLabel.lineBreakMode = UILineBreakModeWordWrap;
NSLog(@"The textLabel text is - %@",textLabel.text);
 1
Author: user3182143,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-15 08:51:04

Dla każdego, kto może mieć problemy z sizeWithFont:constrainedToSize:lineBreakMode: lub ktokolwiek przełączy się na ios8 (metoda jest przestarzała od ios7), dostosowałem swoją wysokość za pomocą sizeToFit zamiast.

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
Author: user3842937,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-15 23:38:51
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];
 0
Author: Grigori A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-16 13:53:23

Wydaje mi się, że źle jest zmieniać rozmiar ramek etykiet, szczególnie podczas korzystania z autolayout. Zastosowanie metody appendFormat wydaje się bardziej odpowiednie. Oto mój przykład:

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
Author: tanya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-06 16:59:33

Jeśli ustawisz swoje właściwości UILable od zwykłego do przypisanego...Etykieta UILabel będzie zawierała tekst wielowierszowy bez względu na liczbę akapitów wzdłuż, ponieważ wysokość i szerokość etykiety UILabel są ustawione tak, aby pasowały do obszaru ekranu, w którym ma być wyświetlany tekst.

 0
Author: BrainyMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-11 11:12:34

Stanąłem przed tym samym problemem i oto, jak go rozwiązałem. Mam nadzieję, że to będzie pomocne dla kogoś.

// 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;  
 0
Author: Suraj Sonawane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-07 10:27:52