How to add leading padding to view added inside an UIStackView

IosSwiftUiscrollviewUistackview

Ios Problem Overview


This is my setup: I have an UIScrollView with leading,top, trialing edge set to 0. Inside this I add an UIStackView with this constraints:

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

Inside the stack view I add some views.
My issue is that because of the constraints the first view added to stack view will also have leading edge = 0.

What are the ways that I could add some padding to the first view ? Without adjusting the scroll view constraints.

Ios Solutions


Solution 1 - Ios

When isLayoutMarginsRelativeArrangement property is true, the stack view will layout its arranged views relative to its layout margins.

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

But it affects all arranged views inside to the stack view. If you want this padding for only one arranged view, you need to use nested UIStackView

Solution 2 - Ios

I have found that constraints don't work inside a Stack View, or they seem somewhat strange.

(Such as if I add leading/trailing constraint to selected on image stackview, that adds leading to collectionview too, but doesn't add trailing; and it be conflict for sure).

stackview inside stackview

To set layout margins for all views inside the stackview, select:

Stack View > Size Inspector > Layout Margins > Fixed

Note: "Fixed" option was formerly called "Explicit", as seen in the screenshots.

Then add your padding:

storyboard

Solution 3 - Ios

The solution you have provided doesn't add a padding for your views inside your UIStackView (as you wanted in the question), but it adds a leading for the UIStackView.

A solution could be to add another UIStackView inside your original UIStackView and give the leading to this new UIStackVIew. Then, add your views to this new UIStackView.

Hint, you can do that completely using Interface Builder. In other words, no need to write code for it.

Solution 4 - Ios

What worked for me is to add to stack view another UIView that's just a spacer (works at least with 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)...

Solution 5 - Ios

If you only need leading padding, then you can set the stack view's Alignment to "Trailing" and then you will be free to specify unique Leading constraints on each of its contained subviews.

As a bonus, you can also set the stack view's alignment to "Center" and then you can use Leading and/or Trailing constraints to give each item its own padding on both sides.

Solution 6 - Ios

swift 3: You just need set offset by:

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

Be sure this constraint set after you parentView.addArrangdSubView(firstView)

Solution 7 - Ios

Set your stackview alignment to "center". After that you can give every subview different leading and trailing.

Solution 8 - Ios

The solution would be to have a regular view in the stack view to hold whatever views you are wanting to add constraints to, and then you can add constraints for your items that are relative to the views in the stack view. That way, your original views can have leading and trailing constraints within the stack view.

This can be done in the interface builder and programatically.

Solution 9 - Ios

This question already has good answers, One suggestion though, use spacing property to set the spacing between the views. For first and last views there can be two options, either set insets as @tolpp suggested or add constraint attaching to parent (stackview) with constant to add padding.

Solution 10 - Ios

What we did was add transparent components (e.g., UIButton/UIView) as the first and last children of the UIStackView. Then set constrain the width of these invisible children to adjust the padding.

Solution 11 - Ios

It seems that the solution was pretty simple. Instead of:

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

I just wrote:

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

Solution 12 - Ios

Just add an empty view at the beginning of the stack view (also constraining its width and/or height):

stackView.insertArrangedSubview(UIView().constrain(width: 0, height: 0), at: 0)

and/or at the end:

stackView.addArrangedSubview(UIView().constrain(width: 0, height: 0))

I created this simple UIView extension to add the constraints:

extension UIView {
    func constrain(width: CGFloat, height: CGFloat) -> Self {
        NSLayoutConstraint.activate([
            widthAnchor.constraint(equalToConstant: width),
            heightAnchor.constraint(equalToConstant: height)
        ])

        return self
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdrianView Question on Stackoverflow
Solution 1 - IosTolga OkurView Answer on Stackoverflow
Solution 2 - IosZaporozhchenko OleksandrView Answer on Stackoverflow
Solution 3 - IosWilliam KinaanView Answer on Stackoverflow
Solution 4 - IosdorszView Answer on Stackoverflow
Solution 5 - IosJonathan ParhamView Answer on Stackoverflow
Solution 6 - IosWilliam HuView Answer on Stackoverflow
Solution 7 - IosDaniis1infiniteloopView Answer on Stackoverflow
Solution 8 - IosAiden DixonView Answer on Stackoverflow
Solution 9 - IosinfiniteLoopView Answer on Stackoverflow
Solution 10 - IosCrashalotView Answer on Stackoverflow
Solution 11 - IosAdrianView Answer on Stackoverflow
Solution 12 - IosSergiu TodirascuView Answer on Stackoverflow