2015-07-19 12 views
5

Ho cercato di impostare una vista contenitore semplice in IB utilizzando UIStackView. Voglio che questo contenitore centra la sua unica sottoview organizzata e rispetta la dimensione intrinseca del contenuto della sottoview.Utilizzo di UIStackView per centrare la vista singola

Sfortunatamente per tutte le possibili configurazioni di allineamento e distribuzione, la vista secondaria viene allungata per riempire la larghezza lungo l'asse.

Questo sembra un caso di bordo strano o un bug, perché una volta aggiunta una seconda vista tutto si comporta come previsto e entrambe le sottoview mantengono le loro dimensioni definite dal metodo di dimensione del contenuto intrinseco.

Mi piacerebbe capire perché UIStackView si comporta in questo modo.

+2

"[La vista pila attacca la prima e l'ultima vista allineata con il suo bordo lungo l'asse della pila. Per una pila orizzontale, ciò significa che il bordo anteriore della prima vista sistemata è bloccato sul bordo anteriore della pila e il bordo finale dell'ultima vista sistemata è bloccato sul bordo finale della pila. Per le pile verticali, i bordi superiore e inferiore sono bloccati, rispettivamente.] (Https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIStackView_Class_Reference/) "Quindi se inserisci una sottoview , sarà allungato per riempire l'asse dello stack. E 'questo quello che stai vedendo? –

+1

Sì. Quello che non capisco è il motivo per cui questo sovrascrive le dimensioni intrinseche del contenuto, anche se imposto il contenuto che abbraccia la priorità su "alto". –

risposta

8

UIStackView crea vincoli con una priorità di 1000 (la massima priorità consentita), ovvero UILayoutPriorityRequired. Il layout automatico è necessario per soddisfare questi vincoli, se possibile.

Il vincolo sulla priorità "alta" (UILayoutPriorityDefaultHigh == 750, presumo) è in conflitto con i vincoli richiesti della vista dello stack, pertanto il layout automatico ignorerà il vincolo.

Se si imposta la priorità del vincolo su 1000, il layout automatico non sarà in grado di soddisfare tutti i vincoli richiesti. Registrerà un errore e interromperà uno dei vincoli. Non puoi scegliere quale vincolo si rompe.

Si noti che è necessario interrompere solo uno dei tre vincoli per risolvere il sistema e può rompere uno dei tre vincoli in conflitto. Tuttavia, rompere uno qualsiasi dei tre vincoli in conflitto non lascerà un sistema che centra la tua vista. La vista dovrebbe essere allungata o abbracciata a una estremità della vista pila, a seconda di quale vincolo si interrompe il layout automatico. E una versione futura di iOS potrebbe cambiare il layout automatico in modo che un vincolo diverso venga rotto e il layout cambi.

Non è chiaro il motivo per cui si sta tentando di utilizzare una vista stack per centrare la vista. Se hai solo una vista e vuoi centrarla, rendi la sua genitrice una semplice UIView invece di una UIStackView, e imposta i vincoli per centrare la tua vista nella vista genitore.

Se si utilizza una vista stack perché a volte si desidera più di una sottoview organizzata nello stack, è necessario aggiungere due viste spaziatore nascoste (una a ciascuna estremità dell'asse) oltre alla vista del contenuto (s). Crea un vincolo di uguale larghezza o uguale altezza tra i distanziatori.

+0

Grazie! Sono stato ingannato da "Debug Hierarchy View" che mostrava _76_ come la priorità del vincolo in ispettore. –

+0

Perché sto tentando di utilizzare la visualizzazione stack per il centraggio? Stavo cercando qualcosa che possa essere impostato interamente in IB. –

+0

@RobertWijas IB consente di definire i vincoli '.CenterX' e' .CenterY', che centreranno la vista. Fai clic sul pulsante "Allinea" (il secondo nell'angolo in basso a destra dello spazio di lavoro IB) o trascina il controllo dalla sottoview alla sua superview e vedrai le opzioni del "centro". Forse non sto capendo il tuo commento. – Rob

Problemi correlati