Come aggiungere la spaziatura interna iniziale alla visualizzazione aggiunta all'interno di un UIStackView


127

Questa è la mia configurazione: ho un UIScrollViewcon bordo iniziale, superiore, di prova impostato su 0. All'interno di questo aggiungo un UIStackViewcon questi vincoli:

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

All'interno della vista stack aggiungo alcune viste.
Il mio problema è che a causa dei vincoli la prima vista aggiunta alla vista stack avrà anche leading edge = 0.

Quali sono i modi in cui potrei aggiungere un po 'di riempimento alla prima visualizzazione? Senza regolare i vincoli della visualizzazione di scorrimento.


2
cambieresti la risposta accettata? La risposta di Tolga sembra molto migliore.
Miele

Risposte:


27

La soluzione che hai fornito non aggiunge un riempimento per le tue visualizzazioni all'interno di UIStackView (come volevi nella domanda), ma aggiunge un'interlinea per UIStackView.

Una soluzione potrebbe essere quella di aggiungere un altro UIStackView all'interno del tuo UIStackView originale e dare il comando a questo nuovo UIStackVIew. Quindi, aggiungi le tue visualizzazioni a questo nuovo UIStackView.

Suggerimento, puoi farlo completamente utilizzando Interface Builder. In altre parole, non è necessario scrivere codice per questo.


375

Quando la isLayoutMarginsRelativeArrangementproprietà è vera, la vista pila imposterà le sue viste disposte rispetto ai suoi margini di layout.

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

Ma influisce su tutte le viste disposte all'interno della vista pila. Se vuoi questo riempimento per una sola vista organizzata, devi usare annidatoUIStackView


2
isLayoutMarginsRelativeArrangementè un getter, il setter lo è layoutMarginsRelativeArrangement. Non riesco a modificare la risposta
maross

5
@maross non c'è differenza tra la funzione getter e setter in Swift. Ma hai ragione, le persone che sviluppano con Objective-C dovrebbero usare layoutMarginsRelativeArrangementinvece. Documentazione ufficiale: developer.apple.com/reference/uikit/uistackview/…
Tolga Okur

3
Per l'Obiettivo C:stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];
Snouto

4
Febbraio 2019, a mezzanotte seduto in ufficio - Risposte come queste mi danno la forza di andare avanti. Grazie @tolpp
nefarianblack

156

Ho scoperto che i vincoli non funzionano all'interno di una visualizzazione stack o sembrano alquanto strani.

(Ad esempio se aggiungo un vincolo iniziale / finale a selezionato su stackview di immagini, che aggiunge anche il lead a collectionview, ma non aggiunge il trailing; e sicuramente è un conflitto).

stackview all'interno di stackview

Per impostare i margini del layout per tutte le viste all'interno dello stackview, selezionare:

Stack View > Size Inspector > Layout Margins > Fixed

Nota: l' "Fixed"opzione era precedentemente chiamata "Explicit", come si vede negli screenshot.

Quindi aggiungi la tua imbottitura:

storyboard


23
una delle cose che Apple nasconde. Odio come Xcode sia l'opposto di buono, amichevole e facile. Grazie
Duck

Xcode continua a bloccarsi quando cambio quei margini di layout espliciti. Ha presentato un bug ma hanno risposto che era un duplicato.
mvandillen

Questo è quello che non sono riuscito a trovare nell'interfaccia utente. Modificare i margini del layout in Esplicito per visualizzare i campi per i margini della vista stack.
pkamb

13
Cordiali saluti, XCode 9 ora chiama questo "Fixed" invece di "Explicit".
Mel

Anche in Xcode 9, deseleziona "Usa guide layout area sicura" in File inspector, che al momento della scrittura causa ancora molti problemi in IB, e segui le normali guide di layout per i tuoi vincoli.
PJ_Finnegan

16

Quello che ha funzionato per me è aggiungere alla visualizzazione dello stack un altro UIView che è solo uno spaziatore (funziona almeno con stackView.distribution = .Fill):

let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...

6

swift 3: devi solo impostare l'offset di:

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

Assicurati che questo vincolo venga impostato dopo di te parentView.addArrangdSubView(firstView)


4

Se hai solo bisogno del riempimento iniziale, puoi impostare l'allineamento della vista stack su "Trailing" e quindi sarai libero di specificare vincoli iniziali univoci su ciascuna delle sue viste secondarie contenute.

Come bonus, puoi anche impostare l'allineamento della vista pila su "Centro" e quindi puoi usare i vincoli Leading e / o Trailing per dare a ciascun elemento il proprio riempimento su entrambi i lati.


1

Questa domanda ha già buone risposte, un suggerimento però, usa la spacingproprietà per impostare la spaziatura tra le viste. Per la prima e l'ultima vista ci possono essere due opzioni, impostare gli inserti come suggerito da @tolpp o aggiungere vincoli collegati al genitore (stackview) con costante per aggiungere riempimento.


1

La soluzione sarebbe avere una visualizzazione regolare nella visualizzazione stack per contenere tutte le visualizzazioni a cui si desidera aggiungere vincoli, quindi è possibile aggiungere vincoli per gli elementi relativi alle visualizzazioni nella visualizzazione stack. In questo modo, le visualizzazioni originali possono avere vincoli iniziali e finali all'interno della visualizzazione stack.

Questo può essere fatto nel costruttore dell'interfaccia e in modo programmatico.


0

Quello che abbiamo fatto è stato aggiungere componenti trasparenti (ad esempio, UIButton / UIView) come il primo e l'ultimo figlio di UIStackView. Quindi imposta la larghezza di questi bambini invisibili per regolare l'imbottitura.


-3

Sembra che la soluzione fosse piuttosto semplice. Invece di:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

Ho appena scritto:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true

1
in realtà il tuo codice aggiunge un inizio per uistackview all'interno di urscrollview, non aggiunge un riempimento per le tue visualizzazioni all'interno del tuo uistackview, (come afferma la domanda)
William Kinaan

sì, ma non so se puoi aggiungere imbottitura, quindi questo funzionerà per me.
Adrian

come primo pensiero, puoi un altro uistackview all'interno del tuo uistackview originale e dargli il riempimento. quindi aggiungi le tue visualizzazioni a questo nuovo uistackview (puoi farlo completamente dal costruttore dell'interfaccia, non è necessario scrivere codice per esso)
William Kinaan

Sì, funzionerà. Puoi aggiungere come risposta e lo accetterò.
Adrian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.