Align some descendants to bottom, and some to top

14.5k views Asked by At

As a root view of my app, I have a ZStack, and I would like to add two floating bars, one to the bottom, and one to the top of the viewport.

With a single bar it's easy (ZStack(alignment: .top)), but is there a way to add multiple descendants, and have one aligned to the top, and a second one to the bottom?

I tried removing alignment from ZStack, and adding .frame(alignment: .top) / .frame(alignment: .bottom) to the children, but this didn't do anything.

Yes, it could be hacked around by wrapping a top-aligned ZStack with another, bottom-aligned one, but it seems rather inelegant.

3

There are 3 answers

0
Asperi On BEST ANSWER

Here is possible approach

ZStack {

 // content here

}
.overlay(YourTopView(), alignment: .top)
.overlay(YourBottomView(), alignment: .bottom)

Other possible variant is to use one .overlay with VStack having two views and Spacer in between.

1
Hieu Dinh On

You can just add a VStack inside your ZStack like this

ZStack {
    VStack {
        YourTopView()
        Spacer()
        YourBottomView()
    }
}
0
Bruce Webster On

Here's another approach that allows overlap of the top and bottom-aligned views.

ZStack() {
    VStack() {
        topView()
        Spacer()
    }
    VStack() {
        Spacer()
        bottomView()
    }
}