REGARDEZ, PAS D'ENTRETOISES !
Sur la base des suggestions faites dans la section des commentaires de ma réponse originale, en particulier les suggestions utiles de @Rivera, j'ai simplifié ma réponse originale.
J'utilise des gifs pour illustrer à quel point c'est simple. J'espère que vous trouverez les gifs utiles. Au cas où vous auriez un problème avec les gifs, j'ai inclus l'ancienne réponse ci-dessous avec des captures d'écran simples.
Instructions :
1) Ajoutez vos boutons ou vos étiquettes. J'utilise 3 boutons.
2) Ajoutez une contrainte x centrale de chaque bouton à la vue supérieure :
3) Ajoutez une contrainte de chaque bouton à la contrainte de disposition inférieure :
4) Ajustez la contrainte ajoutée en #3 ci-dessus comme suit :
a) sélectionnez la contrainte, b) supprimer la constante (mise à 0), c) modifiez le multiplicateur comme suit : prenez le nombre de boutons + 1, et en commençant par le haut, définissez le multiplicateur comme suit buttonCountPlus1:1 et ensuite boutonCountPlus1:2 et enfin boutonCountPlus1:3 . (J'explique d'où je tiens cette formule dans l'ancienne réponse ci-dessous, si cela vous intéresse).
5) Voici une démo en cours !
Remarque : si vos boutons ont une hauteur supérieure, vous devrez compenser cela dans la valeur constante puisque la contrainte part du bas du bouton.
Ancienne réponse
Malgré ce que disent les documents d'Apple et l'excellent livre d'Erica Sadun ( La mise en page automatique démystifiée ) disent, il est possible d'égaliser les vues de l'espace sin entretoises. Cette opération est très simple à réaliser dans l'IB et dans le code pour n'importe quel nombre d'éléments que vous souhaitez espacer de manière égale. Tout ce dont vous avez besoin est une formule mathématique appelée "formule de section". C'est plus simple à faire qu'à expliquer. Je vais faire de mon mieux en la démontrant dans l'IB, mais elle est tout aussi facile à réaliser en code.
Dans l'exemple en question, vous devez
1) commencez par définir une contrainte de centre pour chaque étiquette. C'est très simple à faire. Il suffit de faire un glisser-déposer de chaque étiquette vers le bas.
2) Maintenez la touche shift enfoncée, car vous pourriez tout aussi bien ajouter l'autre contrainte que nous allons utiliser, à savoir le "guide de mise en page de l'espace inférieur à l'espace inférieur".
3) Sélectionnez le guide de mise en page "espace inférieur à inférieur", et "centrer horizontalement dans le conteneur". Faites cela pour les 3 étiquettes.
En gros, si nous prenons l'étiquette dont nous voulons déterminer les coordonnées et que nous la divisons par le nombre total d'étiquettes plus 1, nous obtenons un nombre que nous pouvons ajouter à IB pour obtenir l'emplacement dynamique. Je simplifie la formule, mais vous pourriez l'utiliser pour définir l'espacement horizontal ou les deux en même temps. C'est super puissant !
Voici nos multiplicateurs.
Étiquette1 = 1/4 = .25,
Étiquette2 = 2/4 = 0,5,
Étiquette3 = 3/4 = .75
(Edit : @Rivera a commenté que vous pouvez simplement utiliser les ratios directement dans le champ du multiplicateur, et xCode avec faire le calcul !)
4) Donc, sélectionnons Label1 et sélectionnons la contrainte inférieure. Comme ceci :
5) Sélectionnez le "Deuxième élément" dans l'inspecteur d'attributs.
6) Dans la liste déroulante, sélectionnez "Inverser le premier et le deuxième élément".
7) Remettre à zéro la constante et la valeur wC hAny. (Vous pouvez ajouter un offset ici si vous en avez besoin).
8) C'est la partie critique : Dans le champ du multiplicateur, ajoutez notre premier multiplicateur 0,25.
9) Pendant que vous y êtes, réglez le "Premier élément" supérieur sur "CenterY" puisque nous voulons le centrer sur le centre y de l'étiquette. Voici à quoi tout cela devrait ressembler.
10) Répétez ce processus pour chaque étiquette et ajoutez le multiplicateur correspondant : 0,5 pour l'étiquette 2, et 0,75 pour l'étiquette 3. Voici le produit final dans toutes les orientations avec tous les appareils compacts ! Super simple. J'ai examiné de nombreuses solutions impliquant des rames de code et des espaceurs. C'est de loin la meilleure solution que j'ai vue sur le sujet.
Mise à jour : @kraftydevil ajoute que le guide de mise en page Bottom n'apparaît que dans les storyboards, pas dans les xibs. Utilisez 'Bottom Space to Container' dans les xibs. Bien vu !
0 votes
Il serait peut-être utile de définir une contrainte d'une étiquette à l'autre, et de définir la relation "supérieur ou égal".
0 votes
De manière programmatique, par exemple en utilisant cette méthode de NSLayoutConstraint : + (id)constraintWithItem :(id)view1 attribute :(NSLayoutAttribute)attr1 relatedBy :(NSLayoutRelation)relation toItem :(id)view2 attribute :(NSLayoutAttribute)attr2 multiplier :(CGFloat)multiplier constant :(CGFloat)c
0 votes
J'ai créé un remplacement générique de UITabBar qui généralise cette approche en utilisant Auto Layout. Vous pouvez consulter les tests pour voir comment je génère mes contraintes Auto Layout. GGTabBar