REGARDEZ, PAS D'ESPACES!
Sur la base des suggestions de la section commentaires de ma réponse d'origine, en particulier des suggestions utiles de @ Rivera, j'ai simplifié ma réponse d'origine.
J'utilise des gifs pour illustrer à quel point c'est simple. J'espère que vous trouverez les gifs utiles. Juste 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 étiquettes. J'utilise 3 boutons.
2) Ajoutez une contrainte centrale x de chaque bouton à la vue d'ensemble:
3) Ajoutez une contrainte de chaque bouton à la contrainte de mise en page inférieure:
4) Ajustez la contrainte ajoutée au point 3 ci-dessus comme suit:
a) sélectionnez la contrainte,
b) supprimez la constante (définie sur 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 , puis sur buttonCountPlus1 : 2 , et enfin buttonCountPlus1: 3 . (Si vous êtes intéressé, je vous explique d'où j'ai tiré cette formule dans l'ancienne réponse ci-dessous).
5) Voici une démo en cours d'exécution!
Remarque: Si vos boutons ont des hauteurs plus grandes, vous devrez compenser cela dans la valeur constante car la contrainte vient du bas du bouton.
Ancienne réponse
Malgré les documents d'Apple et l'excellent livre d'Erica Sadun ( disent Auto Layout Demystified ), il est possible d'espacer uniformément les vues sans entretoises. C'est très simple à faire en IB et en code pour n'importe quel nombre d'éléments que vous souhaitez espacer uniformément. Tout ce dont vous avez besoin est une formule mathématique appelée "formule de section". C'est plus simple à faire qu'à expliquer. Je ferai de mon mieux en le démontrant en IB, mais c'est tout aussi facile à faire en code.
Dans l'exemple en question, vous
1) commencez par définir chaque étiquette pour avoir une contrainte centrale. C'est très simple à faire. Contrôlez simplement le glissement de chaque étiquette vers le bas.
2) Maintenez la touche Maj enfoncée, car vous pourriez aussi bien ajouter l'autre contrainte que nous allons utiliser, à savoir le "guide de mise en page de l'espace du bas au bas".
3) Sélectionnez le "guide de mise en page de l'espace inférieur vers le bas" et "centre horizontalement dans le conteneur". Faites cela pour les 3 étiquettes.
Fondamentalement, si nous prenons l'étiquette dont nous voulons déterminer les coordonnées et la divisons par le nombre total d'étiquettes plus 1, alors nous avons un nombre que nous pouvons ajouter à IB pour obtenir l'emplacement dynamique. Je simplifie la formule, mais vous pouvez l'utiliser pour définir l'espacement horizontal ou à la fois vertical et horizontal en même temps. C'est super puissant!
Voici nos multiplicateurs.
Label1 = 1/4 = .25,
Label2 = 2/4 = 0,5,
Label3 = 3/4 = 0,75
(Edit: @Rivera a commenté que vous pouvez simplement utiliser les ratios directement dans le champ multiplicateur, et xCode avec le calcul!)
4) Alors, sélectionnons Label1 et sélectionnons la contrainte inférieure. Comme ça:
5) Sélectionnez le "deuxième élément" dans l'inspecteur d'attributs.
6) Dans le menu déroulant, 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 décalage ici si vous en avez besoin).
8) Voici la partie critique: dans le champ multiplicateur, ajoutez notre premier multiplicateur 0,25.
9) Pendant que vous y êtes, réglez le premier "Premier élément" sur "CenterY" car 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 branchez le multiplicateur correspondant: 0,5 pour Label2 et 0,75 pour Label3. Voici le produit final dans toutes les orientations avec tous les appareils compacts! Super simple. J'ai étudié de nombreuses solutions impliquant des rames de code et des espaceurs. C'est de loin la meilleure solution que j'ai vue sur la question.
Mise à jour: @kraftydevil ajoute que le guide de disposition inférieur n'apparaît que dans les storyboards, pas dans xibs. Utilisez 'Bottom Space to Container' dans les xibs. Bonne prise!