web-dev-qa-db-fra.com

Comment ajouter un remplissage principal pour l'affichage ajouté dans un UIStackView

Voici ma configuration: J'ai un UIScrollView avec un bord d’essai d’essai défini sur 0. À cela, j’ajoute un UIStackView avec ces contraintes:

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

Dans la vue de pile, j'ajoute quelques vues.
Mon problème est qu’à cause des contraintes, la première vue ajoutée à la vue pile aura également Edge = 0 en tête.

Comment puis-je ajouter du rembourrage à la première vue? Sans ajuster les contraintes de vue de défilement.

98
Adrian

La solution que vous avez fournie n’ajoute pas de remplissage à vos vues dans votre UIStackView (comme vous le souhaitiez dans la question), mais elle ajoute un avantage pour UIStackView.

Une solution pourrait consister à ajouter un autre UIStackView à l’intérieur de votre UIStackView d’origine et à indiquer le début de cette nouvelle UIStackVIew. Ajoutez ensuite vos vues à cette nouvelle UIStackView.

Astuce, vous pouvez le faire complètement en utilisant Interface Builder. En d'autres termes, pas besoin d'écrire du code pour cela.

23
William Kinaan

Lorsque la propriété isLayoutMarginsRelativeArrangement a la valeur true, la vue de pile met en forme ses vues organisées par rapport à ses marges.

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

Mais cela affecte toutes les vues arrangées à l'intérieur de la vue de pile. Si vous souhaitez ce remplissage pour une seule vue organisée, vous devez utiliser imbriqué UIStackView

318
Tolga Okur

J'ai constaté que les contraintes ne fonctionnaient pas dans une vue pile ou semblaient plutôt étranges.

(Par exemple, si j'ajoute une contrainte de début/fin à la sélection sur l'image, cela ajoute également un avantage à collectionview, mais n'ajoute pas de fin; et ce sera un conflit à coup sûr).

stackview inside stackview

Pour définir les marges de présentation pour toutes les vues à l'intérieur de la pile, sélectionnez:

Stack View > Size Inspector > Layout Margins > Fixed

Remarque: L'option "Fixed" s'appelait auparavant "Explicit", comme le montrent les captures d'écran.

Ajoutez ensuite votre rembourrage:

storyboard

137

Ce qui a fonctionné pour moi est d’ajouter à la vue pile un autre UIView qui n’est qu’un spacer (fonctionne au moins avec 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)...
15
dorsz

Swift 3: Vous avez juste besoin de régler offset par:

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

Assurez-vous que cette contrainte est définie après vous parentView.addArrangdSubView(firstView)

5
William Hu

Si vous n'avez besoin que d'un remplissage de doublure, vous pouvez définir l'alignement de la vue de la pile sur "Trailing". Vous serez ensuite libre de spécifier des contraintes Lead uniques sur chacune de ses sous-vues contenues.

En prime, vous pouvez également définir l'alignement de la vue de pile sur "Centre", puis utiliser les contraintes Lead et/ou Trailing pour attribuer à chaque élément son propre remplissage des deux côtés.

3
Jonathan Parham

Cette question a déjà de bonnes réponses. Une suggestion cependant, utilisez la propriété spacing pour définir l'espacement entre les vues. Pour les première et dernière vues, il peut y avoir deux options, soit définir les encarts comme suggéré par @tolpp, soit ajouter une contrainte attachée au parent (stackview) avec une constante pour ajouter du remplissage.

1
infiniteLoop

Nous avons ajouté des composants transparents (par exemple, UIButton/UIView) en tant que premier et dernier enfant de UIStackView. Ensuite, configurez la largeur de ces enfants invisibles pour ajuster le remplissage.

0
Crashalot