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.
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.
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
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).
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:
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)...
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)
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.
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.
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.