Vous ne décrivez pas l'adaptation à l'échelle; vous décrivez l'aspect en forme. (J'ai édité votre question à cet égard.) La sous-vue devient aussi grande que possible tout en conservant ses proportions et en s'adaptant entièrement à l'intérieur de son parent.
Quoi qu'il en soit, vous pouvez le faire avec la mise en page automatique. Vous pouvez le faire entièrement dans IB à partir de Xcode 5.1. Commençons par quelques vues:
La vue vert clair a un rapport d'aspect de 4: 1. La vue vert foncé a un rapport d'aspect de 1: 4. Je vais configurer des contraintes pour que la vue bleue remplisse la moitié supérieure de l'écran, la vue rose remplisse la moitié inférieure de l'écran et chaque vue verte se développe autant que possible tout en conservant son rapport hauteur / largeur et en s'adaptant à sa récipient.
Tout d'abord, je vais créer des contraintes sur les quatre côtés de la vue bleue. Je vais l'épingler à son voisin le plus proche sur chaque bord, avec une distance de 0. Je m'assure de désactiver les marges:
Notez que je ne mets pas encore à jour le cadre. Je trouve plus facile de laisser de la place entre les vues lors de la configuration des contraintes, et de définir les constantes à 0 (ou autre) à la main.
Ensuite, j'épingle les bords gauche, inférieur et droit de la vue rose à son voisin le plus proche. Je n'ai pas besoin de configurer une contrainte de bord supérieur car son bord supérieur est déjà contraint au bord inférieur de la vue bleue.
J'ai également besoin d'une contrainte d'égale hauteur entre les vues rose et bleue. Cela les fera remplir chacun la moitié de l'écran:
Si je dis à Xcode de mettre à jour tous les cadres maintenant, j'obtiens ceci:
Les contraintes que j'ai mises en place jusqu'à présent sont donc correctes. Je défais cela et commence à travailler sur la vue vert clair.
Ajuster l'aspect de la vue vert clair nécessite cinq contraintes:
- Une contrainte de rapport d'aspect prioritaire requise sur la vue vert clair. Vous pouvez créer cette contrainte dans un xib ou un storyboard avec Xcode 5.1 ou version ultérieure.
- Une contrainte de priorité requise limitant la largeur de la vue vert clair à être inférieure ou égale à la largeur de son conteneur.
- Une contrainte de priorité élevée définissant la largeur de la vue vert clair pour être égale à la largeur de son conteneur.
- Une contrainte de priorité requise limitant la hauteur de la vue vert clair à une valeur inférieure ou égale à la hauteur de son conteneur.
- Une contrainte de haute priorité définissant la hauteur de la vue vert clair pour être égale à la hauteur de son conteneur.
Considérons les deux contraintes de largeur. La contrainte inférieure ou égale, en soi, n'est pas suffisante pour déterminer la largeur de la vue vert clair; de nombreuses largeurs s'adapteront à la contrainte. Puisqu'il y a ambiguïté, la mise en page automatique essaiera de choisir une solution qui minimise l'erreur dans l'autre contrainte (prioritaire mais non requise). Minimiser l'erreur signifie rendre la largeur aussi proche que possible de la largeur du conteneur, tout en ne violant pas la contrainte inférieure ou égale requise.
La même chose se produit avec la contrainte de hauteur. Et comme la contrainte de rapport hauteur / largeur est également requise, elle ne peut que maximiser la taille de la sous-vue le long d'un axe (sauf si le conteneur a le même rapport hauteur / largeur que la sous-vue).
Donc, je crée d'abord la contrainte de rapport d'aspect:
Ensuite, je crée des contraintes de largeur et de hauteur égales avec le conteneur:
J'ai besoin de modifier ces contraintes pour être des contraintes inférieures ou égales:
Ensuite, je dois créer un autre ensemble de contraintes de largeur et de hauteur égales avec le conteneur:
Et je dois faire de ces nouvelles contraintes moins que la priorité requise:
Enfin, vous avez demandé que la sous-vue soit centrée dans son conteneur, je vais donc configurer ces contraintes:
Maintenant, pour tester, je vais sélectionner le contrôleur de vue et demander à Xcode de mettre à jour toutes les images. Voici ce que j'obtiens:
Oups! La sous-vue s'est développée pour remplir complètement son conteneur. Si je le sélectionne, je peux voir qu'en fait, il a conservé son rapport d'aspect, mais il fait un remplissage d' aspect au lieu d'un ajustement d' aspect .
Le problème est que sur une contrainte inférieure ou égale, il importe quelle vue se trouve à chaque extrémité de la contrainte, et Xcode a mis en place la contrainte opposée à mon attente. Je pouvais sélectionner chacune des deux contraintes et inverser ses premier et deuxième éléments. Au lieu de cela, je vais simplement sélectionner la sous-vue et modifier les contraintes pour qu'elles soient supérieures ou égales:
Xcode met à jour la disposition:
Maintenant, je fais tout de même la vue vert foncé en bas. Je dois m'assurer que son rapport d'aspect est de 1: 4 (Xcode l'a redimensionné de manière étrange car il n'avait pas de contraintes). Je ne montrerai plus les étapes car elles sont les mêmes. Voici le résultat:
Maintenant, je peux l'exécuter dans le simulateur iPhone 4S, qui a une taille d'écran différente de celle utilisée par IB, et tester la rotation:
Et je peux tester dans le simulateur iPhone 6:
J'ai téléchargé mon storyboard final dans cet élément pour votre commodité.
Rob, ta réponse est géniale! Je sais également que cette question concerne spécifiquement la réalisation de cet objectif en utilisant la mise en page automatique. Cependant, juste comme référence, je voudrais montrer comment cela peut être fait dans le code. Vous configurez les vues de dessus et de dessous (bleu et rose) comme Rob l'a montré. Ensuite, vous créez un personnalisé
AspectFitView
:AspectFitView.h :
AspectFitView.m :
Ensuite, vous changez la classe des vues bleues et roses dans le storyboard en
AspectFitView
s. Enfin, vous définissez deux prises pour votre viewcontrollertopAspectFitView
etbottomAspectFitView
et définissez leurschildView
s dansviewDidLoad
:Il n'est donc pas difficile de le faire dans le code et il est toujours très adaptable et fonctionne avec des vues de taille variable et des rapports d'aspect différents.
Mise à jour de juillet 2015 : trouvez une application de démonstration ici: https://github.com/jfahrenkrug/SPWKAspectFitView
la source
J'avais besoin d'une solution de la réponse acceptée, mais exécutée à partir du code. La façon la plus élégante que j'ai trouvée est d'utiliser le framework Masonry .
la source
C'est pour macOS.
J'ai du mal à utiliser la méthode de Rob pour obtenir un ajustement d'aspect sur l'application OS X. Mais je l'ai fait d'une autre manière - Au lieu d'utiliser la largeur et la hauteur, j'ai utilisé les espaces de début, de fin, haut et bas.
Fondamentalement, ajoutez deux espaces de tête où l'un est> = 0 @ 1000 priorité requise et un autre est = 0 @ 250 priorité faible. Faites les mêmes réglages pour les espaces de fin, supérieur et inférieur.
Bien sûr, vous devez définir le rapport d'aspect et le centre X et le centre Y.
Et puis le travail est fait!
la source
Je me suis retrouvé à vouloir un comportement de remplissage d' aspect afin qu'un UIImageView conserve son propre rapport d'aspect et remplisse entièrement la vue du conteneur. De façon confuse, mon UIImageView brisait les DEUX contraintes de largeur et de hauteur égales de haute priorité (décrites dans la réponse de Rob) et le rendu à pleine résolution.
La solution consistait simplement à définir la priorité de résistance à la compression du contenu de UIImageView inférieure à la priorité des contraintes de largeur et de hauteur égales:
la source
Il s'agit d'un port de l'excellente réponse de @ rob_mayoff à une approche centrée sur le code, utilisant des
NSLayoutAnchor
objets et portés sur Xamarin. Pour moi,NSLayoutAnchor
et les classes connexes ont rendu AutoLayout beaucoup plus facile à programmer:la source
C'est peut-être la réponse la plus courte, avec la maçonnerie , qui prend également en charge le remplissage d'aspect et l'étirement.
la source