2013-06-17 20 views
12

Próbuję zaimplementować ograniczoną podklasę UITableViewCell i wszystko działa idealnie, z wyjątkiem UILabel. Ograniczenia, które ustawiłem, są zdecydowanie wymuszane, ale tekst wewnątrz etykiety nie zmienia rozmiaru na mniejszy rozmiar czcionki, gdy zderzają się więzy. Zamiast tego wysokość UILabel zostaje obcięta, a czcionka pozostaje tej samej wielkości, co oznacza, że ​​litery zostają obcięte u góry iu dołu.Tekst UILabel nie jest automatycznie zmieniany automatycznie przy użyciu automatycznego układu

Czy jest jakaś metoda, którą muszę zadzwonić, aby to zadziałało? Myślę, że Auto Layout byłby wystarczająco inteligentny, aby automatycznie zmienić rozmiar czcionki, więc jestem trochę zagubiony, dlaczego tak się dzieje.

odpowiedni kod:

self.label = [[UILabel alloc] initWithFrame:CGRectZero]; 
self.label.textColor = [UIColor whiteColor]; 
self.label.translatesAutoresizingMaskIntoConstraints = NO; 
self.label.textAlignment = NSTextAlignmentCenter; 
self.label.numberOfLines = 1; 
[self.contentView addSubview:self.label]; 

NSLayoutConstraint *otherViewToLabelHorizontalConstraint = // Make sure that the label is always to the right of the other view. 
        [NSLayoutConstraint constraintWithItem:self.label 
               attribute:NSLayoutAttributeLeft 
               relatedBy:NSLayoutRelationGreaterThanOrEqual 
                toItem:self.otherView 
               attribute:NSLayoutAttributeRight 
               multiplier:1.0 
                constant:0.0]; 

NSLayoutConstraint *aTextFieldToLabelVerticalConstraint = 
        [NSLayoutConstraint constraintWithItem:self.label 
               attribute:NSLayoutAttributeTop 
               relatedBy:NSLayoutRelationGreaterThanOrEqual 
                toItem:self.aTextField 
               attribute:NSLayoutAttributeBottom 
               multiplier:1.0 
                constant:0.0]; 

Zasadniczo te ograniczenia mają na celu wymuszenia komórkę gdzie otherView jest po lewej stronie, aTextField znajduje się na prawo od otherView w tym samym y poziomu i etykiety jest poniżej aTextField i na prawo od dna otherView.

Jak zwykle, dziękuję za pomoc w tej sprawie.

+0

Czy podczas dodawania tych ograniczeń pojawia się w konsoli wyjątek lub inna wiadomość dziennika? – larsacus

+0

Nie, w końcu pozbyłem się części, które używały tego ograniczenia. –

Odpowiedz

7

Trzeba

myLabel.adjustsFontSizeToFitWidth = YES; 
myLabel.minimumScaleFactor = .5f; 

Następnie etykieta rozmiar czcionki zostaną automatycznie skorygowane.

+2

Dzięki za odpowiedź, ale po wdrożeniu tego kodu nadal pozostaje odcięta u góry iu dołu. Mam czcionkę o rozmiarze 18.0f. Przetestowałem czcionkę i minimum, które musi zmieścić, to 13.0f, więc nie rozumiem, dlaczego nie skalowałoby go automatycznie aż do osiągnięcia mnożnika 0,5f. –

2

Wraz z ustawieniami adjustsFontSizeToFitWidth i minimumScaleFactor należy również ustawić niską ważność kompresji zawartości etykiety. Zapoznaj się z sekcją "Wytrzymałość na ściskanie i ściskanie zawartości" tego objc.io essay. Zasadniczo, jeśli etykieta ma niższy priorytet wytrzymałość na ściskanie niż ograniczenie spływu, etykieta powinna się zmieniany:

[myLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow 
           forAxis:UILayoutConstraintAxisHorizontal]; 
+0

Jeśli etykieta jest obcinana, chcesz uzyskać wysoką odporność na kompresję, a nie niską. Czy nie? – smileBot

2

I rozwiązać ten problem przez ustawienie żądanej szerokości ograniczenie do widoku byłem łącząc etykietę.

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0f constant:width]; 

Upewnij się, że priorytet dla tego ograniczenia jest ustawiony na UILayoutPriorityRequired.

[constraint setPriority:UILayoutPriorityRequired]; 

Tekst został rozmiaru podczas przypięcie etykiety do SuperView ale nie do pola tekstowego, więc wywnioskować, że musi być problem z nieodłącznych elementów wielkości zaangażowanych w obliczeniach układ dla końcowej szerokości etykiety.

+1

co to jest "rozmiar" w "stała: rozmiar"? – jowie

+0

To rzeczywista szerokość widoku, które chcesz ograniczyć. Zmieniłem go na szerokość, tak jak powinno być. Dzięki za zauważenie błędu – ale0xB