Źródło: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html
Rozmiar zawartości wewnętrznej tekstu wielowierszowego
Rzeczywisty rozmiar zawartości UILabel i NSTextField jest niejednoznaczny w przypadku tekstu wielowierszowego. Wysokość tekstu zależy od szerokości linii, która nie została jeszcze ustalona przy rozwiązywaniu ograniczeń. W celu rozwiązania tego problemu obie klasy mają nową właściwość o nazwie preferowanyMaxLayoutWidth, która określa maksymalną szerokość linii do obliczania wewnętrznej wielkości zawartości.
Ponieważ zwykle nie znamy tej wartości z wyprzedzeniem, musimy zastosować dwustopniowe podejście, aby uzyskać tę prawidłowość. Najpierw pozwalamy Auto Layout wykonać swoją pracę, a następnie wykorzystujemy wynikową ramkę w przebiegu układu, aby zaktualizować preferowaną maksymalną szerokość i ponownie uruchomić układ.
- (void)layoutSubviews
{
[super layoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[super layoutSubviews];
}
Pierwsze wywołanie [super layoutSubviews] jest konieczne, aby etykieta mogła ustawić ramkę, a drugie wywołanie jest konieczne do zaktualizowania układu po zmianie. Jeśli pominiemy drugie wywołanie, otrzymamy błąd NSInternalInconsistencyException, ponieważ dokonaliśmy zmian w przebiegu układu, które wymagają aktualizacji ograniczeń, ale nie uruchomiliśmy układu ponownie.
Możemy to również zrobić w samej podklasie etykiet:
@implementation MyLabel
- (void)layoutSubviews
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
}
@end
W tym przypadku nie musimy najpierw wywoływać [super layoutSubviews], ponieważ kiedy wywoływany jest layoutSubviews, mamy już ramkę na samej etykiecie.
Aby dokonać tej regulacji z poziomu kontrolera widoku, przechodzimy do viewDidLayoutSubviews. W tym momencie ramki pierwszego przebiegu automatycznego układu są już ustawione i możemy ich użyć, aby ustawić preferowaną maksymalną szerokość.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
Na koniec upewnij się, że nie masz wyraźnego ograniczenia wysokości na etykiecie, która ma wyższy priorytet niż priorytet odporności na kompresję zawartości etykiety. W przeciwnym razie przebije obliczoną wysokość zawartości. Sprawdź wszystkie ograniczenia, które mogą wpłynąć na wysokość etykiety.