2015-10-07 12 views
37

Ho un semplice orizzontale UIStackView con diverse UIViews impilate all'interno. Il mio obiettivo è creare spaziature variabili tra le viste. Sono ben consapevole di poter creare uno spazio costante tra le sottoview usando la proprietà "spaziatura". Tuttavia il mio obiettivo è creare uno spazio variabile. Si prega di notare che, se possibile, vorrei evitare di utilizzare viste invisibili che fungono da distanziatori.Come posso creare UIStackView con spaziatura variabile tra le viste?

Il meglio che ho avuto è stato quello di avvolgere le mie UIViews in un UIStackView separato e utilizzare layoutMarginsRelativeArrangement = YES per rispettare i margini di layout del mio stack interno. Speravo di poter fare qualcosa di simile con qualsiasi UIView senza ricorrere a questo brutto lavoro. Qui è il mio codice di esempio:

// Create stack view 
UIStackView *stackView = [[UIStackView alloc] init]; 
stackView.translatesAutoresizingMaskIntoConstraints = NO; 
stackView.axis = UILayoutConstraintAxisHorizontal; 
stackView.alignment = UIStackViewAlignmentCenter; 
stackView.layoutMarginsRelativeArrangement = YES; 

// Create subview 
UIView *view1 = [[UIView alloc] init]; 
view1.translatesAutoresizingMaskIntoConstraints = NO; 
// ... Add Auto Layout constraints for height/width 
// ... 
// I was hoping the layoutMargins would be respected, but they are not 
view1.layoutMargins = UIEdgeInsetsMake(0, 25, 0, 0); 

// ... Create more subviews 
// UIView view2 = [[UIView alloc] init]; 
// ... 

// Stack the subviews 
[stackView addArrangedSubview:view1]; 
[stackView addArrangedSubview:view2]; 

Il risultato è una pila con vista proprio accanto a vicenda con la spaziatura:

enter image description here

risposta

46

aggiornamento per iOS 11, StackViews con personalizzato spaziatura

Apple ha aggiunto la possibilità di impostare la spaziatura personalizzata in iOS 11. È sufficiente specificare la spaziatura dopo ogni sottomenu organizzata. Purtroppo non è possibile specificare prima la spaziatura.

stackView.setCustomSpacing(10.0, after: firstLabel) 
stackView.setCustomSpacing(10.0, after: secondLabel) 

Ancora molto meglio che usare le proprie viste.

Per iOS 10 e sotto

Si potrebbe semplicemente aggiungere una vista trasparenti nella vostra vista stack e aggiungere vincoli di larghezza a loro.

(Label - UIView - Label - UIView -Label)

e se si mantiene distribution da riempire, quindi è possibile impostare vincoli di larghezza variabile sui vostri UIViews.

Ma vorrei prendere in considerazione se questa è la situazione giusta per utilizzare la pila di immagini, se è il caso. L'Autolayout semplifica molto l'impostazione delle larghezze variabili tra le viste.

+2

Grazie ma speravo di non dover ricorrere a viste vuote per aggiungere spazio o tornare all'Auto Layout. Anche se UIStackView non supporta il mio caso d'uso, potrei aver bisogno di farlo comunque. – yura

+1

Perché vuoi che la spaziatura sia variabile? Puoi avere spaziatura variabile se usi "distribuzione" uguale centraggio ". Ciò renderà i centri di uguale larghezza, ma la spaziatura varierà. Spiega di più sul tuo caso d'uso. –

+0

Fondamentalmente, ho diverse viste che ho bisogno di distribuire orizzontalmente (o verticalmente) con uno spazio predeterminato tra le viste, che può avere o meno lo stesso valore. Voglio essere in grado di specificare quei margini con layoutMargins o qualche altro meccanismo. – yura