Ma compréhension de la mise en page automatique est qu'elle prend la taille de la super-vue et qu'elle se base sur des contraintes et des tailles intrinsèques, elle calcule les positions des sous-vues.
Existe-t-il un moyen d'inverser ce processus? Je souhaite redimensionner superview sur la base des contraintes et des tailles intrinsèques. Quelle est la manière la plus simple d'y parvenir?
J'ai une vue conçue dans Xcode que j'utilise comme en-tête pour UITableView
. Cette vue comprend une étiquette et un bouton. La taille de l'étiquette varie en fonction des données. En fonction des contraintes, l'étiquette pousse avec succès le bouton vers le bas ou s'il existe une contrainte entre le bouton et le bas de la vue supervisée, l'étiquette est compressée.
J'ai trouvé quelques questions similaires mais elles n'ont pas de bonnes réponses faciles.
Réponses:
L'API correcte à utiliser est
UIView systemLayoutSizeFittingSize:
, en passant soitUILayoutFittingCompressedSize
ouUILayoutFittingExpandedSize
.Pour une mise
UIView
en page automatique normale, cela devrait fonctionner tant que vos contraintes sont correctes. Si vous souhaitez l'utiliser sur unUITableViewCell
(pour déterminer la hauteur de ligne par exemple), vous devez l'appeler contre votre cellulecontentView
et saisir la hauteur.D'autres considérations existent si vous avez un ou plusieurs UILabel dans votre vue qui sont multilignes. Pour ceux-ci, il est impératif que la
preferredMaxLayoutWidth
propriété soit correctement définie de sorte que l'étiquette fournisse un correctintrinsicContentSize
, qui sera utilisé dans lesystemLayoutSizeFittingSize's
calcul.EDIT: sur demande, ajout d'un exemple de calcul de hauteur pour une cellule de vue tableau
L'utilisation de la disposition automatique pour le calcul de la hauteur des cellules d'un tableau n'est pas très efficace, mais elle est certainement pratique, surtout si vous avez une cellule qui a une disposition complexe.
Comme je l'ai dit ci-dessus, si vous utilisez une multiligne,
UILabel
il est impératif de synchroniser lepreferredMaxLayoutWidth
avec la largeur de l'étiquette. J'utilise uneUILabel
sous-classe personnalisée pour ce faire:Voici une sous-classe UITableViewController artificielle démontrant heightForRowAtIndexPath:
Une simple cellule personnalisée:
Et voici une image des contraintes définies dans le Storyboard. Notez qu'il n'y a pas de contraintes de hauteur / largeur sur l'étiquette - celles-ci sont déduites des étiquettes
intrinsicContentSize
:la source
sizingCell
ou le siencontentView
.sizingCell
largeur correspond à la vôtretableView
.Le commentaire d'Eric Baker m'a fait remonter à l'idée de base que pour qu'une vue ait sa taille déterminée par le contenu qui y est placé, alors le contenu qui y est placé doit avoir une relation explicite avec la vue contenante afin de conduire sa hauteur. (ou largeur) dynamiquement . "Ajouter une sous-vue" ne crée pas cette relation comme vous pourriez le supposer. Vous devez choisir la sous-vue qui pilotera la hauteur et / ou la largeur du conteneur ... le plus souvent, quel que soit l'élément d'interface utilisateur que vous avez placé dans le coin inférieur droit de votre interface utilisateur globale. Voici du code et des commentaires en ligne pour illustrer ce point.
Notez que cela peut être particulièrement utile pour ceux qui travaillent avec des vues de défilement car il est courant de concevoir autour d'une seule vue de contenu qui détermine sa taille (et la communique à la vue de défilement) de manière dynamique en fonction de ce que vous y mettez. Bonne chance, j'espère que cela aidera quelqu'un là-bas.
la source
Vous pouvez le faire en créant une contrainte et en la connectant via le générateur d'interface
Voir l'explication: Auto_Layout_Constraints_in_Interface_Builder
raywenderlich début-auto-layout
Principes de base des contraintes des articles AutolayoutPG
connectez cette prise de contrainte avec vos sous-vues Contrainte ou connectez également des super vues Contrainte et définissez-la en fonction de vos besoins comme ceci
J'espère que cela clarifie la situation.
la source
Cela peut être fait pour une normale
subview
à l' intérieur d'un plus grandUIView
, mais cela ne fonctionne pas automatiquement pourheaderViews
. La hauteur de aheaderView
est déterminée par ce qui est renvoyé partableView:heightForHeaderInSection:
, vous devez donc calculer le enheight
fonctionheight
de l'UILabel
espace plus pour leUIButton
et toutpadding
ce dont vous avez besoin. Vous devez faire quelque chose comme ceci:Voici la
headerString
chaîne que vous souhaitez remplirUILabel
, et le numéro 281 est lewidth
deUILabel
(comme configuré dansInterface Builder
)la source