2012-01-24 17 views
5

Pracuję na aplikacji ios przy użyciu obiektywnego c i mam problem z uilabel, że mogę skorzystać z pomocy. Zasadniczo mam etykietę, która może zmienić rozmiar, aby pasowała do tekstu, który będzie wyświetlać, ale ma maksymalną wysokość, jaką może być. sama etykieta ma stałą szerokość przez cały czas. Włączyłem UILineBreakModeWordWrap i UILineBreakModeTailTruncation, aby tekst był dopasowany i przycięty, ale powoduje to zbyt krótkie przycięcie tekstu, gdy pozostało tylko jedno słowo. raczej przeniesienie go do następnej linii, gdy jest jeszcze miejsce, po prostu ją obcina.Obcinanie uilabel ogonkiem

self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0); 
self.lineBreakMode = UILineBreakModeWordWrap | UILineBreakModeTailTruncation; 
self.numberOfLines = 0; 
[self sizeToFit]; 

jest tam mimo znalezienia gdy UILabel jest faktycznie skrócenie tekstu, więc można następnie sprawdzić wysokość etykiety i dodać do niej, jeśli nadal istnieje? Próbowałem zawsze dodawać dodatkową linię do wysokości, gdy jest miejsce, co pozwala uniknąć wczesnego obcinania, ale potem pozostało z niespójnym rozmiarem całej etykiety. jakieś pomysły na to byłoby wielkie dzięki

Odpowiedz

10

lineBreakMode jest przełącznikiem. Może to być albo (dla iOS6 +) NSLineBreakByWordWrapping lub NSLineBreakByTruncatingTail, ale nie oba.

Ale, aby odpowiedzieć na twoje pytanie, możesz znaleźć rozmiar jakiegoś tekstu przy użyciu rozszerzeń klas w NSString+UIKit. Po znalezieniu rozmiaru można odpowiednio zaktualizować ramkę modelu UILabel.

+0

skończyło się otrzymaniem rozmiaru, który byłby z podanego linku (sizeWithFont :), a następnie ustawiono tryb linebreak na wordwrap lub tail trunc w zależności od tego, czy był w max czy nie, a następnie używał sizetofit i działał świetnie dzięki – glogic

+0

Dobra wskazówka w tej kategorii. Nie wiedziałem, że to istniało wcześniej. – chakrit

1

Napisałem kategorię do pracy ze skróceniem UILabel. Działa na iOS 7 i nowszych. Mam nadzieję, że to pomoże !

+1

nie działa dla wielu linii –

0

Po prostu doszedłem do podobnego problemu i rozwiązałem go z bardzo prostym rozwiązaniem (testowane na ios 8.4, xcode 7).

w IB (użyć autoLayout z pewnymi ograniczeniami)

set UIlabel numberOfLine = 1; 
LineBrakeMode = TruncateTail 

w kodzie:

label.numberOfLines = 2; // I can only display 2 row. 
// I supposed you should know how many rows you can displayed. 

label.preferredMaxLayoutWidth = label.frame.size.width; 
[label sizeToFit]; 

Tadaa. to jest to! Zauważ, że działa to tylko z UILabel. Z UIButtonem może nie działać (nie testowałem).

+0

+1 za odsłonięcie atrybutu "preferredMaxLayoutWidth". Mam inny przypadek z topicstartera, ale ten atrybut rozwiązał mój problem. –