La réponse est [view layoutIfNeeded]
.
Voici pourquoi:
Vous obtenez toujours la largeur et la hauteur actuelles de la vue en inspectant view.bounds.size.width
et view.bounds.size.height
(ou le cadre, qui est équivalent à moins que vous ne jouiez avec leview.transform
).
Si vous voulez la largeur et la hauteur impliquées par vos contraintes existantes, la réponse n'est pas d'inspecter les contraintes manuellement, car cela vous obligerait à réimplémenter toute la logique de résolution de contraintes du système de mise en page automatique afin de les interpréter. contraintes. Au lieu de cela, vous devez simplement demander à la disposition automatique de mettre à jour cette disposition , afin qu'elle résout les contraintes et mette à jour la valeur de view.bounds avec la solution correcte, puis vous inspectez la vue.bounds.
Comment demander à la mise en page automatique de mettre à jour la mise en page? Appelez [view setNeedsLayout]
si vous voulez que la disposition automatique mette à jour la disposition au prochain tour de la boucle d'exécution.
Cependant, si vous souhaitez qu'il mette à jour immédiatement la mise en page, afin de pouvoir accéder immédiatement à la nouvelle valeur de limites ultérieurement dans votre fonction actuelle, ou à un autre moment avant le tour de la boucle d'exécution, vous devez appeler [view setNeedsLayout]
et [view layoutIfNeeded]
.
Vous avez posé une deuxième question: "comment puis-je changer une contrainte hauteur / largeur si je n'y ai pas de référence directement?".
Si vous créez la contrainte dans IB, la meilleure solution consiste à créer un IBOutlet dans votre contrôleur de vue ou dans votre vue pour y faire directement référence. Si vous avez créé la contrainte dans le code, vous devez conserver une référence dans une propriété faible interne au moment où vous l'avez créée. Si quelqu'un d'autre a créé la contrainte, vous devez la trouver en examinant la propriété view.constraints sur la vue, et éventuellement toute la hiérarchie de vues, et en implémentant une logique qui trouve le NSLayoutConstraint crucial. Ce n'est probablement pas la bonne façon de procéder, car cela vous oblige également à déterminer quelle contrainte particulière a déterminé la taille des limites, alors qu'il n'est pas garanti qu'il y ait une réponse simple à cette question. La valeur finale des bornes pourrait être la solution à un système très compliqué de contraintes multiples,