Jak dodać podział linii dla UILabel?

262

Zobaczmy, że mam ciąg znaków wyglądający tak:

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

Jak to zrobić, aby UILabel wyświetlał taki komunikat

AAAAA
BBBBB
CCCCC

Nie wydaje mi się, żeby \nUILabel go rozpoznał, więc czy jest coś, co mogę umieścić w NSString, aby UILabel wiedział, że musi tam utworzyć podział linii?

Thang Pham
źródło

Odpowiedzi:

332

Używaj \ntak, jak używasz w swoim ciągu.

Ustaw numberOfLines na 0, aby zezwolić na 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 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);

Aktualizacja: Zastąpienie za przestarzałe

sizeWithFont:constrainedToSize:lineBreakMode:

Odniesienie, zamiennik przestarzałego rozmiaru Z Czołem: 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);
Gerry Shaw
źródło
2
UILabelnie ma właściwości originnor sizena iOS? Prawdopodobnie powinno być label.frame.origin.xitd.
Peterdk
1
Zamiast używać sizeWithAttributes, a następnie ustawiania ramki, możesz po prostu wywołać sizeToFit, aby opracować i ustawić rozmiar ramki w jednym szybkim kroku.
jimmyjudas,
@Hermang, dziękuję za edycję odpowiedzi w celu jej zaktualizowania.
Gerry Shaw
274

wprowadź opis zdjęcia tutaj

Użyj return-opcji podczas pisania w małym polu w Konstruktorze interfejsów, aby wstawić znak wiersza (\ n). W atrybutach Etykieta Konstruktora interfejsu ustaw # Linie = 0.

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

Marco
źródło
2
to jest bardzo przydatne!
Nitin Alabur,
Szukałem tego na zawsze. Dzięki :)
Shai Mishali
Fantastyczna odpowiedź. Dzięki!
Macondo2Seattle,
1
Nie działa, gdy programowo ustawiasz etykietę i dodajesz \ n (nowa linia) do łańcucha.
Chewie The Chorkie 30.01.2018
niesamowity. Moim wymaganiem było to zrobić tylko z etykietą scenorysu. I działało to jak urok.
Tejas
132

Jeśli odczytasz ciąg z pliku XML, podział wiersza \nw tym ciągu nie będzie działał w UILabeltekście. The\n jest analizowany 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;

Musisz więc zastąpić nieoddzieloną \nczęść łańcucha ciągiem parsowanym \nna sztywnoNSString .

Oto moje inne ustawienia etykiety:

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 numberOfLinesna0 (= nieograniczona liczba linii w etykiecie).

Nie mam pojęcia, dlaczego Apple zdecydowało się nie analizować \n ciągów znaków odczytanych z XML?

Mam nadzieję że to pomoże.

Al-Noor Ladhani
źródło
1
iOS nie analizuje \nprzy pobieraniu ciągów z Parse.com (chyba też stanie się to przy pobieraniu ciągów z innych interfejsów API)
Brian
Uratowałeś mi dzień. Otrzymuję ciąg znaków z nowej linii z plików XML.
Senry,
127

W kreatorze interfejsów możesz użyć Ctrl+, Enteraby wstawić /nw żądanym miejscu. W ten sposób można zrealizować następującą sytuację

aaa
aaaaaaa

kuokuo321
źródło
Nie, nie oddałem głosu. Właśnie zredagowałem odpowiedź dla lepszej prezentacji.
Manoj Kumar
To naprawdę proste! +1
marlonpya
2
Nie mogę uwierzyć, że nigdy nie znałem tej sztuczki! Próbowałem shift-Enter, ponieważ jest to dość standardowe gdzie indziej. Dziękuję za to!
Echelon
właśnie tego szukałem! dziękuję +1!
rickrvo
1
Wspaniały post! Mała korekta: Wierzę, że średni insert \ n zamiast wkładki / n
rzemiosła
25

Musisz ustawić numberOfLineswłaściwość na UILabel. Wartość domyślna to 1 , jeśli ustawisz ją na 0 , usuniesz wszystkie ograniczenia.

Dan
źródło
22

Ważne, aby zauważyć, że to \n(ukośnik odwrotny) zamiast /n.

AndyOng
źródło
10

W Swift 2.2,> iOS 8

Ustawiłem Linie = 0 na Storyboard, w Inspektorze atrybutów i połączyłem odnośnik do etykiety. Następnie użyj w kontrolerze takiego:

 @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"
 }
CodeOverRide
źródło
6

// Nie zapomnij ustawić numberOfLines 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];
Pankaj Chauhan
źródło
6

Po prostu zrób to w ten sposób

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;
Sandip Patel - SM
źródło
4

Na Xcode 6 możesz po prostu użyć \ n nawet w ciągu, gdy używasz zawijania słów. To będzie działać. 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;
Roi
źródło
3

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

Jedną z możliwości jest użycie, UITextViewktóre naprawdę jest przeznaczone dla multilinii.

Możesz to łatwo osiągnąć w sekcji atrybutu XCode UILabel, zobacz zrzut ekranu:

wprowadź opis zdjęcia tutaj

meda
źródło
3

Dla tych, którzy chcą łatwego rozwiązania, wykonaj następujące czynności w polu tekstowym Etykieta:

Upewnij się, że linie liczbowe są ustawione na 0.

Alt + Enter

(Alt to twój klawisz opcji)

Twoje zdrowie!

Derwrecked
źródło
2

Po prostu używam label.numberOfLines = 0;

Smażyć
źródło
2

W moim przypadku również \ n nie działało, rozwiązałem problem, utrzymując liczbę linii na 0, a także kopiowałem i wklejałem tekst z nową linią na przykład zamiast Hello \ n Świat, który wkleiłem

dzień dobry

Świat

w kreatorze interfejsów.

Ranjithkumar
źródło
Doskonały! Pracuje.
DmitryKanunnikoff,
2

W xCode 11, Swift 5 \ndział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"
David_2877
źródło
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);
użytkownik3182143
źródło
0

Dla wszystkich innych, którzy mogą mieć problemy z sizeWithFont:constrainedToSize:lineBreakMode:przełączaniem się na ios8 lub kimkolwiek (metoda jest przestarzała od ios7), dostosowałem swoją wysokość, używając sizeToFitzamiast tego.

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);
użytkownik3842937
źródło
0
NSCharacterSet *charSet = NSCharacterSet.newlineCharacterSet;
NSString *formatted = [[unformatted componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@"\n"];
Grigori A.
źródło
0

Zmienianie rozmiarów ramek etykiet wydaje mi się niewłaściwe, szczególnie w przypadku 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;
tanya
źródło
0

Jeśli ustawisz właściwości UILable z Zwykły na Przypisany ... UILabel będzie przechowywał tekst wielowierszowy bez względu na to, ile akapitów wraz z wysokością i szerokością UILabel są ustawione tak, aby pasowały do ​​obszaru ekranu, w którym chcesz wyświetlić tekst.

BrainyMonkey
źródło
0

Napotkałem ten sam problem i oto jak go rozwiązałem. Mam nadzieję, że to będzie komuś pomocne.

// Swift 2

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

// Cel C

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

// C # (Xamarin.iOS)

  lblMultiline.LineBreakMode = UILineBreakMode.WordWrap;
  lblMultiline.Lines = 0;  
Suraj Sonawane
źródło