GUARDA, NESSUN DISTANZIALE!
Sulla base dei suggerimenti nella sezione commenti della mia risposta originale, in particolare i suggerimenti utili di @ Rivera, ho semplificato la mia risposta originale.
Sto usando gif per illustrare quanto sia semplice. Spero che le gif ti siano utili. Nel caso in cui tu abbia un problema con le gif, ho incluso la vecchia risposta qui sotto con semplici schermate.
Istruzioni:
1) Aggiungi i tuoi pulsanti o etichette. Sto usando 3 pulsanti.
2) Aggiungi un vincolo centrale x da ciascun pulsante alla superview:
3) Aggiungi un vincolo da ciascun pulsante al vincolo di layout inferiore:
4) Regola il vincolo aggiunto nel precedente punto 3 come segue:
a) selezionare il vincolo,
b) rimuovere la costante (impostare su 0),
c) modificare il moltiplicatore come segue: prendere il numero di pulsanti + 1, e partendo dall'alto, impostare il moltiplicatore come buttonCountPlus1: 1 , quindi buttonCountPlus1 : 2 e infine buttonCountPlus1: 3 . (Spiego da dove ho preso questa formula nella vecchia risposta qui sotto, se sei interessato).
5) Ecco una demo in esecuzione!
Nota: se i pulsanti hanno altezze maggiori, sarà necessario compensare questo valore costante poiché il vincolo si trova nella parte inferiore del pulsante.
Vecchia risposta
Nonostante ciò che dicono i documenti di Apple e l'eccellente libro di Erica Sadun ( Disposizione automatica demistificata ), è possibile spaziare uniformemente le viste senza distanziatori. Questo è molto semplice da eseguire in IB e nel codice per qualsiasi numero di elementi che si desidera spaziare uniformemente. Tutto ciò che serve è una formula matematica chiamata "formula di sezione". È più semplice da fare che da spiegare. Farò del mio meglio dimostrandolo in IB, ma è altrettanto facile da fare nel codice.
Nell'esempio in questione, lo faresti
1) iniziare impostando ciascuna etichetta per avere un vincolo centrale. Questo è molto semplice da fare. Basta controllare il trascinamento da ciascuna etichetta verso il basso.
2) Tieni premuto il tasto MAIUSC, dato che potresti anche aggiungere l'altro vincolo che useremo, vale a dire la "guida dal basso allo spazio inferiore".
3) Selezionare la "guida del layout dallo spazio inferiore al fondo" e "centrare orizzontalmente nel contenitore". Fallo per tutte e 3 le etichette.
Fondamentalmente, se prendiamo l'etichetta di cui desideriamo determinare le coordinate e dividerla per il numero totale di etichette più 1, allora abbiamo un numero che possiamo aggiungere a IB per ottenere la posizione dinamica. Sto semplificando la formula, ma potresti usarla per impostare la spaziatura orizzontale o sia verticale che orizzontale allo stesso tempo. È super potente!
Ecco i nostri moltiplicatori.
Etichetta1 = 1/4 = .25,
Etichetta2 = 2/4 = .5,
Etichetta3 = 3/4 = .75
(Modifica: @Rivera ha commentato che puoi semplicemente usare i rapporti direttamente nel campo del moltiplicatore e xCode con fare i calcoli!)
4) Quindi, selezioniamo Label1 e selezioniamo il vincolo inferiore. Come questo:
5) Seleziona il "Secondo oggetto" nella finestra di ispezione degli attributi.
6) Dal menu a discesa selezionare "Inverti primo e secondo elemento".
7) Azzerare la costante e il valore hC di qualsiasi valore. (Puoi aggiungere un offset qui se ne hai bisogno).
8) Questa è la parte critica: nel campo moltiplicatore aggiungi il nostro primo moltiplicatore 0,25.
9) Mentre ci sei, imposta il primo "Primo elemento" su "CentraY" poiché vogliamo centrarlo sul centro y dell'etichetta. Ecco come dovrebbe apparire tutto ciò.
10) Ripetere questo processo per ciascuna etichetta e collegare il moltiplicatore pertinente: 0,5 per Label2 e 0,75 per Label3. Ecco il prodotto finale in tutti gli orientamenti con tutti i dispositivi compatti! Super semplice. Ho cercato molte soluzioni che coinvolgono risme di codice e distanziatori. Questa è di gran lunga la migliore soluzione che ho visto sul problema.
Aggiornamento: @kraftydevil aggiunge che la guida al layout inferiore appare solo negli storyboard, non negli xibs. Usa 'Bottom Space to Container' in xibs. Buona pesca!