Source: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html
Taille du contenu intrinsèque du texte multiligne
La taille du contenu intrinsèque de UILabel et NSTextField est ambiguë pour le texte multiligne. La hauteur du texte dépend de la largeur des lignes, qui reste à déterminer lors de la résolution des contraintes. Afin de résoudre ce problème, les deux classes ont une nouvelle propriété appelée favoriteMaxLayoutWidth, qui spécifie la largeur de ligne maximale pour calculer la taille du contenu intrinsèque.
Puisque nous ne connaissons généralement pas cette valeur à l'avance, nous devons adopter une approche en deux étapes pour y parvenir. Nous laissons d'abord la mise en page automatique faire son travail, puis nous utilisons le cadre résultant dans la passe de mise en page pour mettre à jour la largeur maximale préférée et déclencher à nouveau la mise en page.
- (void)layoutSubviews
{
[super layoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[super layoutSubviews];
}
Le premier appel à [super layoutSubviews] est nécessaire pour que l'étiquette obtienne son jeu de cadres, tandis que le deuxième appel est nécessaire pour mettre à jour la mise en page après la modification. Si nous omettons le deuxième appel, nous obtenons une erreur NSInternalInconsistencyException, car nous avons apporté des modifications dans la passe de mise en page qui nécessitent la mise à jour des contraintes, mais nous n'avons pas déclenché à nouveau la mise en page.
Nous pouvons également le faire dans une sous-classe d'étiquettes elle-même:
@implementation MyLabel
- (void)layoutSubviews
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
}
@end
Dans ce cas, nous n'avons pas besoin d'appeler d'abord [super layoutSubviews], car lorsque layoutSubviews est appelé, nous avons déjà un cadre sur l'étiquette elle-même.
Pour effectuer cet ajustement à partir du niveau du contrôleur de vue, nous nous connectons à viewDidLayoutSubviews. À ce stade, les cadres de la première passe de mise en page automatique sont déjà définis et nous pouvons les utiliser pour définir la largeur maximale préférée.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
Enfin, assurez-vous que vous n'avez pas de contrainte de hauteur explicite sur l'étiquette qui a une priorité plus élevée que la priorité de résistance à la compression du contenu de l'étiquette. Sinon, il l'emportera sur la hauteur calculée du contenu. Assurez-vous de vérifier toutes les contraintes qui peuvent affecter la hauteur de l'étiquette.