Désormais, Interface Builder permet à l'utilisateur de modifier dynamiquement la taille de chaque contrôleur de vue dans le storyboard, pour simuler la taille d'un certain appareil.
Avant cette fonctionnalité, l'utilisateur doit définir manuellement chaque taille de contrôleur de vue. Ainsi, le contrôleur de vue a été enregistré avec une certaine taille, qui a été utilisée initWithCoder
pour définir l'image initiale.
Maintenant, il semble que initWithCoder
n'utilisez pas la taille définie dans le storyboard et définissez une taille de 1000x1000 px pour la vue du contrôleur de vue et toutes ses sous-vues.
Ce n'est pas un problème, car les vues doivent toujours utiliser l'une de ces solutions de mise en page:
mise en page automatique, et toutes les contraintes mettront correctement en page vos vues
autoresizingMask, qui mettra en page chaque vue à laquelle aucune contrainte n'est attachée ( notez que les contraintes de mise en page automatique et de marge sont désormais compatibles dans la même vue \ o /! )
Mais c'est un problème pour tous les éléments de mise en page liés au calque de vue, comme cornerRadius
, car ni la mise en page automatique ni le masque de redimensionnement automatique ne s'appliquent aux propriétés du calque.
Pour répondre à ce problème, la méthode courante consiste à utiliser viewDidLayoutSubviews
si vous êtes dans le contrôleur, ou layoutSubview
si vous êtes dans une vue. À ce stade (n'oubliez pas d'appeler leurs super
méthodes relatives), vous êtes à peu près sûr que tout le travail de mise en page a été fait!
Assez sûr? Hum ... pas totalement, j'ai remarqué, et c'est pourquoi j'ai posé cette question, dans certains cas, la vue a toujours sa taille 1000x1000 sur cette méthode. Je pense qu'il n'y a pas de réponse à ma propre question. Pour donner le maximum d'informations à ce sujet:
1- cela n'arrive que lors de la disposition des cellules! Dans les UITableViewCell
& UICollectionViewCell
sous-classes, layoutSubview
ne sera pas appelé après que les sous- vues soient correctement disposées.
2- Comme l'a fait remarquer @EugenDimboiu (veuillez voter pour sa réponse si cela est utile pour vous), appeler la [myView layoutIfNeeded]
sous-vue non disposée la mettra en page correctement juste à temps.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
3- A mon avis, c'est définitivement un bug. Je l'ai soumis au radar (id 28562874).
PS: je ne suis pas anglophone, alors n'hésitez pas à modifier mon message si ma grammaire doit être corrigée;)
PS2: Si vous avez une meilleure solution, n'hésitez pas à écrire une autre réponse. Je vais proposer la réponse acceptée.