Fonte: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html
Contenuto intrinseco Dimensione del testo multilinea
Le dimensioni intrinseche del contenuto di UILabel e NSTextField sono ambigue per il testo su più righe. L'altezza del testo dipende dalla larghezza delle linee, che deve ancora essere determinata quando si risolvono i vincoli. Per risolvere questo problema, entrambe le classi hanno una nuova proprietà chiamata favoriteMaxLayoutWidth, che specifica la larghezza massima della linea per il calcolo della dimensione del contenuto intrinseco.
Dato che di solito non conosciamo questo valore in anticipo, è necessario adottare un approccio in due fasi per farlo bene. Prima lasciamo che Auto Layout faccia il suo lavoro, quindi usiamo il frame risultante nel passaggio layout per aggiornare la larghezza massima preferita e attivare nuovamente il layout.
- (void)layoutSubviews
{
[super layoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[super layoutSubviews];
}
La prima chiamata a [super layoutSubviews] è necessaria affinché l'etichetta ottenga il set di frame, mentre la seconda chiamata è necessaria per aggiornare il layout dopo la modifica. Se omettiamo la seconda chiamata, viene visualizzato un errore NSInternalInconsistencyException, poiché abbiamo apportato modifiche al passaggio del layout che richiedono l'aggiornamento dei vincoli, ma non abbiamo attivato nuovamente il layout.
Possiamo anche farlo in una sottoclasse di etichette stessa:
@implementation MyLabel
- (void)layoutSubviews
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
}
@end
In questo caso, non è necessario chiamare prima [super layoutSubviews], perché quando viene chiamato layoutSubviews, abbiamo già un frame sull'etichetta stessa.
Per apportare questa modifica dal livello del controller della vista, ci colleghiamo a viewDidLayoutSubviews. A questo punto i frame del primo passaggio Layout automatico sono già impostati e possiamo usarli per impostare la larghezza massima preferita.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
Infine, assicurati di non avere un limite di altezza esplicito sull'etichetta che abbia una priorità più alta rispetto alla priorità di resistenza alla compressione del contenuto dell'etichetta. Altrimenti trionferà sull'altezza calcolata del contenuto. Assicurati di controllare tutti i vincoli che possono influenzare l'altezza dell'etichetta.